1.当前项目的问题

  1. 问题描述:bi项目中使用alibaba-cloud是2.2.1版本,springboot使用的是2.1.7,springcloud使用Greenwich.SR2。pom文件如下

    1. <dependencyManagement>
    2. <dependencies>
    3. <!-- SpringBoot的依赖配置-->
    4. <dependency>
    5. <groupId>org.springframework.boot</groupId>
    6. <artifactId>spring-boot-dependencies</artifactId>
    7. <version>2.1.7.RELEASE</version>
    8. <type>pom</type>
    9. <scope>import</scope>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.springframework.cloud</groupId>
    13. <artifactId>spring-cloud-dependencies</artifactId>
    14. <version>Greenwich.SR2</version>
    15. <type>pom</type>
    16. <scope>import</scope>
    17. </dependency>
    18. <dependency>
    19. <groupId>com.alibaba.cloud</groupId>
    20. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    21. <version>2.2.1.RELEASE</version>
    22. <type>pom</type>
    23. <scope>import</scope>
    24. </dependency>
    25. </dependencies>
    26. </dependencyManagement>
  2. 这里我查看了spring-cloud-alibaba的文档,说 Spring2.x要配spring-cloud-alibaba的2.x

    image.png

①虽然官方这样要求,但是还是要以实际为准
②bi项目用的就是 1所示的配置方式 springboot2.1.x +springcloud-alibaba2.2.x,配置中心用的也好好的没什么问题。

  1. 但是,我们尝试用这套配置去使用 nacos注册中心的功能,就会出现问题了。问题如下:

    java.lang.IllegalStateException: Error processing condition on com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration.nacosReactiveDiscoveryClient

  2. 所以根据官方文档的要求 ,我们升 springboot的版本,同时别忘了 springcloud版本也要升(和springboot版本对应),成功解决。结果pom文件:

    1. <dependencyManagement>
    2. <!-- SpringBoot的依赖配置-->
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.2.4.RELEASE</version>
    7. <type>pom</type>
    8. <scope>import</scope>
    9. </dependency>
    10. <dependencies>
    11. <dependency>
    12. <groupId>org.springframework.cloud</groupId>
    13. <artifactId>spring-cloud-dependencies</artifactId>
    14. <version>Hoxton.SR4</version>
    15. <type>pom</type>
    16. <scope>import</scope>
    17. </dependency>
    18. <dependency>
    19. <groupId>com.alibaba.cloud</groupId>
    20. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    21. <version>2.2.1.RELEASE</version>
    22. <type>pom</type>
    23. <scope>import</scope>
    24. </dependency>
    25. </dependencies>
    26. </dependencyManagement>
  3. 因此,鉴于当前springboot2.1.7版本的,我建议降springcloud-alibaba版本。即使用下面的配置,也是我下面演示实例的父工程的配置 ```xml

    1. <dependencies>
    2. <!-- SpringBoot的依赖配置-->
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.1.7.RELEASE</version>
    7. <type>pom</type>
    8. <scope>import</scope>
    9. </dependency>
    10. <dependency>
    11. <groupId>org.springframework.cloud</groupId>
    12. <artifactId>spring-cloud-dependencies</artifactId>
    13. <version>Greenwich.SR2</version>
    14. <type>pom</type>
    15. <scope>import</scope>
    16. </dependency>
  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  4. <version>2.1.0.RELEASE</version>
  5. <type>pom</type>
  6. <scope>import</scope>
  7. </dependency>
  8. </dependencies>
  9. </dependencyManagement>
  1. <a name="wxZJO"></a>
  2. # 2.Nacos作为注册中心相关使用
  3. <a name="abp4E"></a>
  4. ## 2.1基础演示项目搭建
  5. 1. 环境描述:我们就演示一个服务提供者、一个服务消费者。
  6. 1. 服务提供者:nacos-service1
  7. 2. 服务消费者:nacos-cosumer1
  8. 2. 图形化说明
  9. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1609516/1592877126539-7513340b-d3ae-4350-a810-faf31d12ca4d.png#align=left&display=inline&height=421&margin=%5Bobject%20Object%5D&name=image.png&originHeight=421&originWidth=1099&size=110476&status=done&style=none&width=1099)
  10. <a name="guiiL"></a>
  11. ### 2.1.1nacos-service1的搭建步骤
  12. 1. pom文件
  13. ```xml
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.alibaba.cloud</groupId>
  20. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  21. </dependency>
  1. 配置文件

    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: nacos-service1
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. managetment:
    11. endpoints:
    12. web:
    13. exposure:
    14. include: "*"
  2. 主类代码

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class NacosService1Application {
    4. public static void main(String[] args) {
    5. SpringApplication.run(NacosService1Application.class, args);
    6. }
    7. }
  3. controller层代码

    1. @RestController
    2. public class TestCallController {
    3. @RequestMapping("sayHello")
    4. public String sayHello(){
    5. return "Hello Yunrun";
    6. }
    7. }

    2.1.2nacos-consumer1的搭建步骤

  4. pom文件

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloud</groupId>
    7. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    8. </dependency>
  5. 配置文件

    1. server:
    2. port: 8082
    3. spring:
    4. application:
    5. name: nacos-consumer1
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. managetment:
    11. endpoints:
    12. web:
    13. exposure:
    14. include: "*"
  6. 主类代码(这里我们使用restTemplate的方式,openFeigns方式也可以)

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class NacosConsmer1Application {
    4. public static void main(String[] args) {
    5. SpringApplication.run(NacosConsmer1Application.class, args);
    6. }
    7. @LoadBalanced
    8. @Bean
    9. public RestTemplate restTemplate(){
    10. return new RestTemplate();
    11. }
    12. }
  7. controller层代码

    1. @RestController
    2. public class TestCallServiceController {
    3. @Autowired
    4. private RestTemplate restTemplate;
    5. @RequestMapping("callSayHello")
    6. public String callSayHello(){
    7. return restTemplate.getForObject("http://nacos-service1/sayHello", String.class);
    8. }
    9. }

    2.1.3基础演示项目结果

  8. 时序图 Nacos服务发现知识点 - 图2

  9. 访问结果

image.png

注:下面的所有配制测试都是基于这些配置做的修改

2.2配置项研究

2.2.1spring.cloud.nacos.discovery.server-addr

  1. 结论:配置nacos-server的ip:port
  2. 配置实例(以nacos-service1为例)

    1. spring:
    2. application:
    3. name: nacos-service1
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 127.0.0.1:8848

    3.解释说明:也就说你的 nacos-server的ip地址是 127.0.0.1,端口为8848

    2.2.2spring.cloud.nacos.discovery.service

    1.结论:配置该服务,注册入nacos-server的名称,默认是使用 spring.application.name
    2.基础项目中的配置,注册到nacos-server中的结果
    image.png
    2.配置实例

    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: nacos-service1
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. service: nacos-gaoxi
    11. managetment:
    12. endpoints:
    13. web:
    14. exposure:
    15. include: "*"

    3.结果展示
    image.png

    2.2.3spring.cloud.nacos.discovery.weight

  3. 结论:就是在服务调服务的过程中 ,我同一nacos-service1可能会部署多台服务器上,当我调用nacos-service1时会做一个负载均衡,这是weight值大的就会有多的访问频率

  4. 图形化解释

image.png

2.2.4spring.cloud.nacos.discovery.network-interface

  1. 结论:就是指定使用本机哪块网卡所对应ip,注册入nacos-server
  2. 这个我没研究出来怎么配置,网卡名到底怎么指明没搞懂
  3. 实际我们用到的是下面指定ip的那个配置

    2.2.5spring.cloud.nacos.discovery.ip

  4. 结论:指明服务注册到nacos-sever中ip地址

  5. 配置实例(nacos-service1为例)

①配置前
image.png
②具体配置

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: nacos-service1
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 127.0.0.1:8848
  10. ip: 10.11.60.211
  11. managetment:
  12. endpoints:
  13. web:
  14. exposure:
  15. include: "*"

③配置后
image.png

  1. 特别注意

一定要保证ip 的真实性,虽然ip可以随意写,也都可以注册到nacos-server,但是若ip不是真实的或ip配置有误,当请求服务时会找不到服务

2.2.6spring.cloud.nacos.discovery.port

  1. 结论:同配置ip一样,配置什么端口,注册信息就是什么端口,也要保证真实性

    2.2.7 spring.cloud.nacos.discovery.namespace

    1.结论:指定namespace后,服务会注册到相应的namespace,不同namespace之间服务互不通
    2.图形解释
    image.png
    3.配置(nacos-service1为例)
    ①在nacos-server创建一个namespace
    image.png
    ②配置文件
    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: nacos-service1
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. namespace: 8c387036-874c-4627-a7f1-872bf9b657cc
    11. managetment:
    12. endpoints:
    13. web:
    14. exposure:
    15. include: "*"
    ③结果
    image.png
    image.png

    2.2.8 剩余的配置项,自己看

    image.png

    2.2.9spring.cloud.nacos.discovery.cluster-name

    1.结论:把同一个服务放入不同的集群中,感觉没太大作用,经测试 ,我 nacos-cosumer1在 自己的一个default-cluster中,nacos-service1在James这个集群中,仍然可以调用没有隔离效果
    2.配制实例
    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: nacos-service1
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. cluster-name: James
    11. managetment:
    12. endpoints:
    13. web:
    14. exposure:
    15. include: "*"
    3.结果
    image.png