1.Nacos简介

1.1定义

Nacos是一个注册管理中心、配置中心

1.2作用

  • 服务注册中心(服务的管理)
  • 服务配置中心

    2.Nacos服务器的下载和使用

    2.1下载方式

  1. 下载jar包,直接运行
  2. 下载源码,编译、打包运行

    2.2下载jar包运行的步骤

  3. jar包的下载、解压(https://github.com/alibaba/nacos/releases/tag/1.2.1)

    • 推荐使用1.2.1,打开链接,下载即可
    • 解压
  4. 运行nacos server

    1. .\startup.cmd -m standalone

    2.3下载源码打包运行的步骤

  5. 找到你想要下载的版本

image.png

  1. 下载完成后使用IDEA打开
  2. IDEA中可以自己定制后生成jar包

    2.4Nacos服务器简单使用

    nacos服务器为我们提供了一个可视化的管理界面,非常的友好,默认的地址(http://localhost:8848/nacos),默认的用户名:nacos,密码:nacos
    image.png

    3.Nacos的服务注册与服务调用

    3.1服务注册

    nacos作为一个服务注册中心来使用时的步骤如下:

  3. pom文件

①如果父工程没有继承com.alibaba.cloud,每个微服务的pom中应该加入

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. <version>2.1.0.RELEASE</version>
  5. </dependency>

②若父工程继承了com.alibaba.cloud,即父工程的pom文件如下

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.alibaba.cloud</groupId>
  5. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  6. <version>2.1.0.RELEASE</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

那么子工程不需要写版本

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. </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: "*"

    注:这块有个坑,如果你把最后一行"*"的双引号取出,会报错
    一定要看看技术官方文档 :

    image.png

  2. 注解 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication @EnableDiscoveryClient public class NacosService1Application {

  1. public static void main(String[] args) {
  2. SpringApplication.run(NacosService1Application.class, args);
  3. }

}

  1. 4. 结果查看
  2. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1609516/1592656468330-fe86234a-1d89-4920-bad8-7936bbea5612.png#crop=0&crop=0&crop=1&crop=1&height=320&id=pU1UP&margin=%5Bobject%20Object%5D&name=image.png&originHeight=640&originWidth=1900&originalType=binary&ratio=1&rotation=0&showTitle=false&size=65233&status=done&style=none&title=&width=950)
  3. 5. 小结
  4. Eureka简单的多。
  5. <a name="gXYsB"></a>
  6. ## 3.2服务的调用
  7. 服务的注册不是目的,我们最终的目的是能够实现微服务之间的调用。在官方文档中有这么一句话
  8. > ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1609516/1592656769752-55ef8a6f-acea-48f0-b703-558dba9d2e82.png#crop=0&crop=0&crop=1&crop=1&height=44&id=a9vLe&margin=%5Bobject%20Object%5D&name=image.png&originHeight=88&originWidth=1011&originalType=binary&ratio=1&rotation=0&showTitle=false&size=18324&status=done&style=none&title=&width=505.5)
  9. > 翻译就是:nacos的发现服务集成了nettflix ribbon组件,我们可以通过restTemplate或者openFeign的方式去调用。
  10. 下面就演示服务调用服务的2种方式
  11. <a name="edMd1"></a>
  12. ### 3.2.1通过RestTemplate的方式
  13. 1. 环境描述
  14. 1. 服务提供者就是我们上面的 nacos-service1
  15. 2. 服务消费者我们新建模块 nacos-consumer1
  16. 3. 服务提供者提供一个 `sayHello` 接口
  17. 4. 通过浏览器调用nacos-consmer1`callSayHello`接口,让后通过`callSayHello` 去调用nacos-service1`的sayHello` 接口,并将返回值打印到浏览器中
  18. 2. 搭建步骤
  19. nacos-service1编写`sayHello `接口
  20. ```java
  21. @RestController
  22. public class TestCallController {
  23. @RequestMapping("sayHello")
  24. public String sayHello(){
  25. return "Hello Yunrun";
  26. }
  27. }

②新建nacos-consumer1模块,并且将其注册到nacos server,具体步骤同3.1,端口改成8082即可
③使用restTemplate的方式掉用服务,具体步骤,在nacos中服务注册信息的实例代码中有,这点nacos做的十分到位,如下图:
image.png具体代码:
a.声明bean

  1. @LoadBalanced
  2. @Bean
  3. public RestTemplate restTemplate(){
  4. return new RestTemplate();
  5. }

b.callSayHello代码

  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. }

④结果,浏览器访问 localhost:8082/callSayHello
image.png

3.2.2 通过OpenFeign调用

通过OpenFeign调用,原来使用Eureka注册中心怎么用,现在一样。

  1. 环境描述:
    1. nacos-service1不用改动,只需要再提供一个 nacos-service1-api的Feign的调用类即可
    2. nacos-cosumer2和当前项目的消费者一样,注入服务,调用方法即可
  2. 具体步骤

①nacos-service1 什么都不用动
②nacos-cosumer2 的pom文件

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-openfeign</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>com.alibaba.cloud</groupId>
  11. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  12. </dependency>

③nacos-consumer2编写一个Fegin接口类

  1. @FeignClient(name="nacos-service1")
  2. public interface NacosService1Feign {
  3. @RequestMapping("sayHello")
  4. String sayHello();
  5. }

④nacos-consumer2的主类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableFeignClients
  4. public class NacosCosumer2Application {
  5. public static void main(String[] args) {
  6. SpringApplication.run(NacosCosumer2Application.class, args);
  7. }
  8. }

⑤nacos-comsumer2的配置文件(换个端口和服务名)

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

⑥最后一个主类的注解

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableFeignClients
  4. public class NacosCosumer2Application {
  5. public static void main(String[] args) {
  6. SpringApplication.run(NacosCosumer2Application.class, args);
  7. }
  8. }

⑦Controller接口 callSayHelloByFeign

  1. @RestController
  2. public class TestByFeignController {
  3. @Autowired
  4. private NacosService1Feign nacosService1Feign;
  5. @RequestMapping("callSayHello2")
  6. public String callSayHello2(){
  7. return nacosService1Feign.sayHello();
  8. }
  9. }

⑧浏览器访问 localhost:8083/callSayHelloByFeign
image.png

4.Nacos作为注册中心小结

  1. 以上演示了nacos作为服务注册中心的服务 call 服务 ,可以发现,与原来相比就是pom文件的改变和配置文件的不同。
  2. GateWay的改动也是仅仅需要引入nacos的依赖和在配置中心配置即可

    5.Nacos配置中心

    5.1简单的demo

  3. 引入依赖(与发现者的配置类似,父工程引入后可以省略版本)

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    4. </dependency>
  4. 配置文件(在bootstrap.yml中配置) ```xml spring: application: name: nacos-config cloud: nacos: config:

    1. server-addr: 127.0.0.1:8848
  1. 3. nacos配置文件准备
  2. ①配置的具体内容<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1609516/1592741410516-8ce3e880-3849-4fa3-a3ba-7398b5c2841d.png#crop=0&crop=0&crop=1&crop=1&height=484&id=PJBwI&margin=%5Bobject%20Object%5D&name=image.png&originHeight=484&originWidth=669&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25740&status=done&style=none&title=&width=669)<br />②文件的名称、DataID 是很有讲究的,举例如下:
  3. ```xml
  4. spring.application.name=nacos-config
  5. spring.profiles.active=dev
  6. spring.cloud.nacos.config.file-extension=yaml #默认properties

如上的配置,服务只会找 nacos-config-dev.yaml的DataID。

③ 在只配置了一个spring.application.name默认只会找nacos-config.properties配置文件。

  1. - `file-extension`:默认是`properties`
  2. - `spring.profiles.active`:没有就不用

举例:在只配置了spring.application.name=nacos-config时,如下的配置文件是不可能被寻找到的。
image.png

④将配置文件的dataId改为properties,格式也得是properties。就可以成功
image.png

4.名词解释
①namespace:通过spring.cloud.nacos.config.namespace 指定
②group:通过spring.cloud.nacos.config.group指定
③补充说明:默认的namespace是 public 默认组是default_group
④namespace group dataId 的关系如下

Nacos知识整理 - 图9

5.小结
①nacos作为配置中心,服务会自动根据服务相关信息去找nacos中的配置文件
②由于是配置文件的获取,关于有关获取配置文件的配置信息放在 bootstrap.properties的配置文件中
③yml文件和properties文件要用相应的格式书写配置
④项目自动寻找到的配置文件会自动刷新,也可以通过spring.cloud.nacos.config.refresh-enabled=false去关闭

5.2自定义寻找配置文件

自定义配置文件由两种:

  • ext-config方式:指定不同组中的配置
  • shared-dataids方式:指定同一组中的配置
    1. 通过ext-config配置项
      • spring.cloud.nacos.config.ext-config[n].data-id. 指定文件名
      • spring.cloud.nacos.config.ext-config[n].group. 指定所在组,未指定的话默认 DEFAULT_GROUP
      • 配置这个 spring.cloud.nacos.config.ext-config[n].refresh 来指定该条是否动态刷新
  1. # config external configuration
  2. # 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
  3. spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
  4. # 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
  5. spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
  6. spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
  7. # 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
  8. spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
  9. spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
  10. spring.cloud.nacos.config.ext-config[2].refresh=true
  1. 通过shared-dataids配置项

①文件后缀只能是 properties、yaml、yml
②若所配置的文件在同组,可以使用下面的一个配置方式

  1. #指定组
  2. spring.cloud.nacos.config.group=DEVELOP_GROUP
  3. #指定哪些配置文件
  4. spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
  5. #指定哪些配置文件可以动态刷新
  6. spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties

5.3Nacos作为配置中心小结

  • 需要掌握namespace、group、dataId的含义和关系
  • 配置中心所学习重点就是如何配置和如何寻找