本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

一文弄懂SpringCloud Alibaba服务组件——Nacos

发布于2021-05-29 21:45     阅读(1304)     评论(0)     点赞(25)     收藏(2)


什么是服务治理?

服务治理是微服务架构中最核心最基本的模块,用于实现各个微服务的自动化注册与发现。

服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元像注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心要去检测服务清单中的服务是否可用,不可用需要剔除。

服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体实例服务的访问。

什么是Nacos?

Nacos可以快速实现动态服务发现、服务配置、服务元数据及流量管理,本文基于Nacos2.0记录相关内容。

Nacos安装

Nacos官网    点击版本  下载压缩包

然后以单机模式启动,这是windows的启动方式,如果在linux中以docker方式启动,则为【 docker run -d -p 8848:8848 -e MODE=standalone --name nacos-server 容器id

启动成功后访问 http://localhost:8848/nacos     默认用户名和密码都是nacos,直接登录即可。

服务注册

我们尝试编写一个服务并注册到nacos中

父工程pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>cloud-alibaba-nacos</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <modules>
  11. <module>provider8082</module>
  12. <module>provider8083</module>
  13. <module>comsumer9090</module>
  14. </modules>
  15. <properties>
  16. <spring.boot.version>2.2.5.RELEASE</spring.boot.version>
  17. </properties>
  18. <dependencyManagement>
  19. <dependencies>
  20. <!-- SpringBoot-->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-parent</artifactId>
  24. <version>${spring.boot.version}</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. </project>

然后创建子工程 支付服务提供者provider8082,pom中添加依赖如下:

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

重点是引入nacos的依赖,引入依赖后编写配置文件:

  1. server.port=8082
  2. #nacos服务中心地址
  3. spring.cloud.nacos.discovery.server-addr=Ip
  4. #服务名
  5. spring.cloud.nacos.discovery.service=provider

不需要@EnableDiscoveryClient注解

此时启动该服务,然后查看nacos的后台系统:

然后编写一个控制器用于模拟业务:

  1. @RestController
  2. public class PaymentController {
  3. @Value("${server.port}")
  4. private String port;
  5. @GetMapping("/payment/nacos/{id}")
  6. public String getPayment(@PathVariable("id") Integer id) {
  7. return "nacos服务注册,端口号:" + port + "\t" + "id:" + id;
  8. }
  9. }

测试一下

业务正常。接下来创建第二个支付服务 provider-payment8083 ,代码直接拷贝刚才的服务即可,只需修改端口号为8083,其它都一样。

启动payment8083,查看nacos后台:

 服务消费

有了服务提供者之后,我们理应创建服务消费者来消费这些服务,当然,消费者也是要注册到nacos中的,创建服务 consumer9090,pom文件依然是引入nacos依赖,然后编写配置文件:

  1. server.port=9090
  2. #nacos服务中心地址
  3. spring.cloud.nacos.discovery.server-addr=ip
  4. #服务名
  5. spring.cloud.nacos.discovery.service=consumer

既然是服务消费,那就少不了服务调用,但是nacos已经为我们集成了ribbon,当我们引入nacos依赖的时候,ribbon依赖也随之引入进来了,所以我们可以直接使用ribbon实现负载均衡,那么首先就需要将ribbon注册到容器中:

  1. @Configuration
  2. public class ConsumerConfig {
  3. @Bean
  4. @LoadBalanced
  5. public RestTemplate getRestTemplate(){
  6. return new RestTemplate();
  7. }
  8. }

最后编写控制器

  1. @RestController
  2. public class OrderController {
  3. /**
  4. * 需要调用的服务
  5. */
  6. public static final String SERVER_URL = "http://provider";
  7. @Autowired
  8. private RestTemplate restTemplate;
  9. @GetMapping("/consumer/nacos/{id}")
  10. public String paymentInfo(@PathVariable("id") Integer id) {
  11. // 拼接请求地址
  12. String reqUrl = SERVER_URL + "/payment/nacos/" + id;
  13. return restTemplate.getForObject(reqUrl, String.class);
  14. }
  15. }

启动服务消费者,首先查看nacos后台:

服务注册成功, 测试一下业务代码,访问   localhost:9090/consumer/nacos/1

而且支持负载均衡,默认采用轮询策略。

使用OpenFeign

ribbon虽然能够实现客户端的负载均衡和服务调用,但是稍显麻烦,缺点也很明显,需要在Controller层调用方法请求另外一个服务的Controller方法。为此,我们可以使用OpenFeign来改进这一过程,OpenFeign集成了ribbon,它更侧重服务之间的调用,当然也默认支持负载均衡。

OpenFeign提供了两个重要标注@FeignClient@EnableFeignClients

  • @FeignClient标注用于声明Feign客户端可访问的Web服务。
  • @EnableFeignClients标注用于修饰Spring Boot应用的入口类,以通知Spring Boot启动应用时,扫描应用中声明的Feign客户端可访问的Web服务。

首先修改子项目consumer9090中的pom文件,添加依赖:

  1. <!-- org.springframework.cloud/spring-cloud-starter-openfeign -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. <version>2.2.2.RELEASE</version>
  6. </dependency>

在启动类上添加注解

然后编写一个接口,在该接口上标注 @FeignClient("provider") 注解,其中值为需要远程调用的服务名,在接口中定义方法,一般来说,方法的声明与需要调用的方法声明一致。

  1. @FeignClient("provider")
  2. public interface PaymentService {
  3. @GetMapping("/payment/nacos/{id}")
  4. public String getPayment(@PathVariable("id") Integer id);
  5. }

然后改写order控制层    把接口注入进来,直接调用接口中的方法即可。

  1. @RestController
  2. public class OrderController {
  3. /**
  4. * 需要调用的服务
  5. */
  6. // public static final String SERVER_URL = "http://provider";
  7. //
  8. // @Autowired
  9. // private RestTemplate restTemplate;
  10. //
  11. // @GetMapping("/consumer/nacos/{id}")
  12. // public String paymentInfo(@PathVariable("id") Integer id) {
  13. // // 拼接请求地址
  14. // String reqUrl = SERVER_URL + "/payment/nacos/" + id;
  15. // return restTemplate.getForObject(reqUrl, String.class);
  16. // }
  17. @Autowired
  18. private PaymentService paymentService;
  19. @GetMapping("/consumer/nacos/{id}")
  20. public String paymentInfo(@PathVariable("id") Integer id){
  21. return paymentService.getPayment(id);
  22. }
  23. }

启动项目,测试业务

使用Nacos作为服务配置中心

项目一般都会有多个Profile配置,用于区分开发环境,测试环境,准生产环境,生成环境等,每个环境对应一个properties文件(或是yml/yaml文件),然后通过设置 spring.profiles.active 的值来决定使用哪个配置文件

Nacos Config的作用就把这些文件的内容都移到一个统一的配置中心,即方便维护又支持实时修改后动态刷新应用

Data ID的拼接格式:${prefix} - ${spring.profiles.active} . ${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置

  • spring.profiles.active 取 spring.profiles.active 的值,即为当前环境对应的 profile

  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置

这里我们新建一个子项目 nacos-config2001

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. <version>2.2.1.RELEASE</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  13. <version>2.2.1.RELEASE</version>
  14. </dependency>

这里的配置文件有讲究,我们需要创建一个名为 bootstrap.properties[或者bootstrap.yml]的配置文件,这是因为我们需要优先去配置中心获取所需的配置,当配置中心没有配置时,才使用本地的配置,而bootstrap.x配置文件的优先级高于其它命名的配置文件,故需将配置写在bootstrap.x中。

  1. server.port=2001
  2. #nacos服务中心地址
  3. spring.cloud.nacos.discovery.server-addr=192.168.56.1
  4. #nacos配置中心地址
  5. spring.cloud.nacos.config.server-addr=192.168.56.1
  6. #指定配置文件格式
  7. #spring.cloud.nacos.config.file-extension=yaml
  8. #DataId前缀
  9. spring.cloud.nacos.config.prefix=nacosconfig
  10. #服务名
  11. spring.cloud.nacos.discovery.service=nacos-config2001

这里有一行指定配置文件格式的,因为默认是properties,所以如果用yml就需要配置一下。

编写一个接口测试一下

  1. @RestController
  2. public class ConfigController {
  3. @Value("${config.msg}")
  4. private String msg;
  5. @GetMapping("/config/msg")
  6. public String getMsg() {
  7. return msg;
  8. }
  9. }

在nacos控制台的配置列表中新增配置

然后点击发布

启动项目,开始测试

然后我们修改配置,看是否可以生效 

 发现并未生效,此时回到控制层,在类上添加@RefreshScope  注解 就可以实现在nacos配置中心里修改配置后,就能够立马在项目中生效,无需重新启动项目。

配置管理

nacos作为配置中心,除了能够提供配置外,它还具有非常强大的功能,比如命名空间、配置分组等等,首先说说命名空间。命名空间是用来区分部署环境的,一个项目往往需要经历开发、测试、维护三个阶段,每个阶段的配置内容可能不尽相同,为此,可以创建三个命名空间来分别接管这三个阶段的配置;默认情况下会有一个 public 命名空间。然后是Data ID,前面我们已经了解过Data ID的组成结构,所以我们可以直接通过Data ID的不同来区分不同环境的配置

此时我们就能通过修改:

spring.profiles.active=dev

来分别获取三个配置文件的配置。

接下来我们再来看看分组,默认情况下我们会有一个 DEFAULT_GROUP 分组,新建的配置文件都会被存放在该分组下,通过分组我们也能够区分部署环境的配置信息:

这三个配置文件名相同,但是分组分别属于开发、测试和生产环境,然后通过 group 属性指定即可:

spring.cloud.nacos.config.group=DEV_GROUP

最后是命名空间,通过命名空间,我们仍然能够实现同样的效果:

创建好命名空间后,nacos会为每个命名空间分配id

此时服务会去寻找该命名空间下的指定分组的配置文件,若有环境指定,也需要加上,然后在nacos中新建配置文件: 

  1. spring.cloud.nacos.config.group=DEV_GROUP
  2. spring.cloud.nacos.config.namespace=531bd39b-92b0-4bd9-b1f1-f32333c62ba5

在指定命名空间下创建配置文件即可。

集群模式

3个或3个以上Nacos节点才能构成集群。在本地搭建的伪集群

配置集群配置文件

nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

把【conf】目录下的sql文件导入数据库

【conf】目录下集群配置文件,把该文件后缀名【.example】去掉之后,修改该文件中的内容

请每行配置成ip:port。(请配置3个或3个以上节点)

接着修改【application.properties】文件中的db信息

把nacos目录复制两份,目录名添加对应的端口号,把每个服务中【conf】目录下的【application.properties】文件中的端口号修改

把这三个服务依次启动即可

原文链接:https://blog.csdn.net/QingXu1234/article/details/116094694



所属网站分类: 技术文章 > 博客

作者:我爱编程

链接:http://www.javaheidong.com/blog/article/207494/ed03c63065ffb09815b4/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)