【Nacos】02-Nacos注册中心与SpringCloud

cover

Nacos注册中心与SpringCloud

简介

nacos:服务的注册中心与配置中心

应用

服务注册

编码

  1. 项目结构

    img-01

  2. pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <dependencies>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.8</version>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
    </dependencies>
  3. application.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 9011
    spring:
    application:
    name: cloud-ali-service
    cloud:
    nacos:
    discovery:
    server-addr: nacos8848.com:8848 # nacos注册中心 地址配置。注意:不能加前缀http,会报错
    management:
    endpoints:
    web:
    exposure:
    include: '*'
  4. AliServiceMain9011.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /**
    * 1. nacos-注册中心
    * 1.1 依赖
    * spring-cloud-alibaba-nacos-discovery
    * 1.2 配置
    * spring:
    * cloud:
    * nacos:
    * discovery:
    * server-addr: nacos8848.com:8848 # nacos注册中心 地址配置。注意:不能加前缀http,会报错
    * 1.3 启动类
    * 添加注解:@EnableDiscoveryClient
    * @author zsq
    * @create 2021-09-04-23:03:32
    */
    @EnableDiscoveryClient
    @SpringBootApplication
    public class AliServiceMain9011 {

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

    }
  5. TestController.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       @Slf4j
    @RestController
    @RequestMapping("/test")
    public class TestController {

    @GetMapping("/ok/{id}")
    public String ok(@PathVariable("id") String id) {
    String result = "ali.service - ok - id = " + id;
    log.info(result);
    return result;
    }

    }
  6. 启动项目,并编写相同服务,改项目名称为cloud-ali-service-9012

使用

  1. 打开http://nacos8848:8848/nacos,找到服务列表

    服务名:cloud-ali-service

    实例数:2

    img-02

  2. 查看详情

    img-03

负载均衡

编写一个cloud-ali-service的服务消费者,通过负载均衡调用生产者提供的接口。

由下图可见,nacos服务注册中心引入了ribbon依赖,是得其可以通过负载均衡实现生产者服务的接口调用

img-04

编码

编写消费者服务的代码

  1. 项目结构

    img-05

  2. pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <dependencies>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.8</version>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
    </dependencies>
  3. application.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    server:
    port: 9021
    spring:
    application:
    name: cloud-ali-consumer
    cloud:
    nacos:
    discovery:
    server-addr: nacos8848.com:8848

    # 消费者将要去访问的微服务名称,该路径名自己取。代码中通过@Value引入微服务名
    nacos-server:
    service-name: cloud-ali-service
  4. AliConsumerMain9021.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /**
    * 1. 消费者负载均衡调用生产者
    * 1.1 依赖
    * spring-cloud-alibaba-nacos-discovery:该依赖中包含ribbon的依赖
    * 1.2 配置
    * server:
    * port: 9021
    * spring:
    * application:
    * name: cloud-ali-consumer
    * cloud:
    * nacos:
    * discovery:
    * server-addr: nacos8848.com:8848
    * # 消费者将要去访问的微服务名称,该路径名自己取。代码中通过@Value引入微服务名
    * nacos-server:
    * service-name: cloud-ali-service
    * 1.3 启动类
    * 添加注解:@EnableDiscoveryClient
    * 1.4 配置类
    * 使用注解:@Bean@LoadBalanced
    * public RestTemplate getRestTemplate() {
    * return new RestTemplate();
    * }
    * 注解LoadBalanced:启动负载均衡
    * 1.5 控制层
    * 见该类{@link ConsumerTestController}
    * @author zsq
    * @create 2021-09-04-23:55:25
    */
    @EnableDiscoveryClient
    @SpringBootApplication
    public class AliConsumerMain9021 {

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

    }
  5. RestTemplateConfig.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Configuration
    public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    return new RestTemplate();
    }
    }
  6. ConsumerTestController.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Slf4j
    @RequestMapping("/consumer")
    @RestController
    public class ConsumerTestController {

    @Resource
    private RestTemplate restTemplate;

    /**
    * 服务名称:cloud-ali-service
    */
    @Value("${nacos-server.service-name}")
    private String serverName;

    /**
    * 1. 使用ribbon负载均衡,通过服务名称serverName,调用服务接口
    * 2. 负载均衡调用方式`restTemplate.getForObject("http://serverName/path", String.class)`
    * @param id 入参
    * @return result
    */
    @GetMapping("/ok/{id}")
    public String ok(@PathVariable("id") String id) {
    String result = "ali.consumer - ok - id = " + id;
    log.info(result);
    return restTemplate.getForObject("http://" + serverName + "/test/ok/" + id, String.class);
    }

    }
  7. 启动项目

注意:nacos中服务调用使用的负载均衡为ribbon,因此启动负载均衡需要使用@LoadBalance注解

使用

  1. 调用接口http://localhost:9021/consumer/ok/15次

    页面返回结果:

    img-06

    生产者服务中,接口的调用情况,查看日志。两接口均被调用

    cloud-ali-service:9011

    img-07

    cloud-ali-service:9012

    img-08

  2. 如果此时还不能确定是否调用负载均衡,可以使用如下操作:

    修改生产者的返回值:将端口号也加入到返回值中即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Slf4j
    @RestController
    @RequestMapping("/test")
    public class TestController {

    @Value("${server.port}")
    private Integer port;

    @GetMapping("/ok/{id}")
    public String ok(@PathVariable("id") String id) {
    String result = "ali.service - " + port + " - ok - id = " + id;
    log.info(result);
    return result;
    }

    }
  3. 重启项目后,再次调用接口http://localhost:9021/consumer/ok/1,返回结果如下:

    1. 结果:ali.service - 9012 - ok - id = 1

      img-09

    2. 结果:ali.service - 9011 - ok - id = 1

      img-10

  4. 可以发现,负载均衡真的配置成功了

-------------本文结束感谢您的阅读-------------