一、Nacos基本介绍

  • 1.Nacos是什么
    • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
    • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
    • Nacos是Java语言编写的,阿里巴巴推出的

其实总结就是:Nacos可以帮助我们实现“服务注册中心”和“分布式配置中心”

二、构建NacosServer端

  • 1.Nacos下载地址
    • https://github.com/alibaba/nacos/releases
  • 2.Nacos启动方法
    • windows下启动:D:\nacos-server-2.0.3\nacos\bin\startup.cmd(路径根据自己的目录)
  • 3.Nacos2.0启动错误
    • Nacos默认是集群方法启动
    • 可以修改为单机模式启动
      • 修改startup.cmd,将set MODE="cluster"修改为set MODE="standalone"

在这里插入图片描述
在这里插入图片描述

  • 4.访问Nacos
    • 访问地址:http://192.168.187.1:8848/nacos/index.html
    • 默认账户密码:nacos/nacos

在这里插入图片描述
在这里插入图片描述

三、手动实现Nacos服务注册与服务发现

1、服务注册API

  • 1.Nacos实现服务注册API接口
    • 发送post请求:
      • http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=sjyl-producer&ip=127.0.0.1&port=8080
  • 2.使用PostMan发送测试
    在这里插入图片描述
  • 3.在Nacos的服务列表中查看是否注册成功
    在这里插入图片描述
    在这里插入图片描述
  • 4.服务续约问题
    • 15s内没有服务续约:服务信息为粉色,表示是不健康的服务
    • 30s内没有服务续约:那么Nacos就会将该服务剔除

在这里插入图片描述

2、服务发现API

  • 1.Nacos实现服务发现API接口
    • 浏览器访问地址(其中sjyl-producer就是上一步服务注册的服务名):
      • http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=sjyl-producer

在这里插入图片描述

{
    "name": "DEFAULT_GROUP@@sjyl-producer",
    "groupName": "DEFAULT_GROUP",
    "clusters": "",
    "cacheMillis": 10000,
    "hosts": [
        {
            "instanceId": "127.0.0.1#8080#DEFAULT#DEFAULT_GROUP@@sjyl-producer",
            "ip": "127.0.0.1",
            "port": 8080,
            "weight": 1.0,
            "healthy": true,
            "enabled": true,
            "ephemeral": true,
            "clusterName": "DEFAULT",
            "serviceName": "DEFAULT_GROUP@@sjyl-producer",
            "metadata": {},
            "instanceIdGenerator": "simple",
            "instanceHeartBeatTimeOut": 15000,
            "ipDeleteTimeout": 30000,
            "instanceHeartBeatInterval": 5000
        }
    ],
    "lastRefTime": 1648629964220,
    "checksum": "",
    "allIPs": false,
    "reachProtectionThreshold": false,
    "valid": true
}

四、NacosClient实现服务注册

  • 1.新建项目
    • 父项目:spring-cloud-nacos
    • 子项目:spring-cloud-nacos-producer
  • 2.父项目pom依赖
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 3.子项目pom依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
    </dependencies>
  • 4.application.yml
server:
  port: 8080
spring:
  application:
    name: sjyl-producer-member  #服务名称 在 注册中心展示服务名称 --
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # nacos服务注册中心Server端 地址
  • 5.启动类AppProducer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppProducer {
    public static void main(String[] args) {
        SpringApplication.run(AppProducer.class);
    }
}
  • 6.启动spring-cloud-nacos-producer

在这里插入图片描述
在这里插入图片描述

五、NacosClient实现服务发现

  • 1.新建子项目spring-cloud-nacos-consumer
  • 2.pom依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
    </dependencies>
  • 3.application.yml
server:
  port: 8070
spring:
  application:
    name: sjyl-consumer-order  #服务名称 在 注册中心展示服务名称 --
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # nacos服务注册中心Server端 地址
  • 4.OrderToMemberService
    • 这里就不远程RPC调用了,直接返回从nacos注册中心获取的ip和端口
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class OrderToMemberService {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/orderToMember")
    public String orderToMember() {
        /*
         * 根据服务名称 从注册中心 获取 会员的接口地址
         * 服务提供 启动多个集群
         *
         */
        List<ServiceInstance> instances = discoveryClient.getInstances("sjyl-producer-member");
        ServiceInstance serviceInstance = instances.get(0);
        // 会员服务的ip和端口
        return "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/" + "getMember";
    }
}
  • 5.启动类AppConsumer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppConsumer {
    public static void main(String[] args) {
        SpringApplication.run(AppConsumer.class);
    }
}
  • 6.nacos服务列表

在这里插入图片描述
在这里插入图片描述

  • 7.浏览器访问
    • 访问地址:http://127.0.0.1:8070/orderToMember
    • 我们可以看到获取到的ip地址和端口就是服务sjyl-producer-member的ip和端口

在这里插入图片描述

六、整合RestTemplate实现RPC

  • 1.RestTemplate介绍
    • RestTemplate是从 Spring3.0 开始支持的一个 HTTP 请求工具
    • 它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute
    • RestTemplate继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现
    • RestTemplate底层是基于HttpClient封装的
  • 2.OrderToMemberService代码修改
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class OrderToMemberService {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/orderToMember")
    public String orderToMember() {
        /*
         * 根据服务名称 从注册中心 获取 会员的接口地址
         * 服务提供 启动多个集群
         *
         */
        List<ServiceInstance> instances = discoveryClient.getInstances("sjyl-producer-member");
        ServiceInstance serviceInstance = instances.get(0);
        // 会员服务的ip和端口
        String memberUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/" + "getMember";
        return "订单服务调用会员服务:" + restTemplate.getForObject(memberUrl, String.class);
    }
}
  • 3.AppConsumer启动增加RestTemplate注入
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class AppConsumer {
    public static void main(String[] args) {
        SpringApplication.run(AppConsumer.class);
    }

    /*
     * 将restTemplate注入到spring ioc容器
     *
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • 4.spring-cloud-nacos-producer增加MemberService
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberService {
    @RequestMapping("/getMember")
    public String getMember() {
        return "我是会员服务接口...";
    }
}
  • 5.浏览器测试
    • 浏览器访问:http://127.0.0.1:8070/orderToMember

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐