系列文章目录
第一章 Java线程池技术应用
第二章 CountDownLatch和Semaphone的应用
第三章 Spring Cloud 简介
第四章 Spring Cloud Netflix 之 Eureka
第五章 Spring Cloud Netflix 之 Ribbon
第六章 Spring Cloud 之 OpenFeign
第七章 Spring Cloud 之 GateWay
第八章 Spring Cloud Netflix 之 Hystrix
第九章 代码管理gitlab 使用
第十章 SpringCloud Alibaba 之 Nacos discovery
文章目录
前言
Nacos 英文全称为 Dynamic Naming and Configuration Service,它是一个开源的、易于使用的、功能强大的配置和发现管理系统,由阿里巴巴团队使用 Java 语言开发的开源项目。Nacos 为微服务架构提供了一种简单、灵活、动态的配置管理方案,可以支持大规模的分布式系统和云原生应用。它旨在提供动态服务发现、配置管理和服务管理等功能,帮助开发者构建易于扩展、动态适应的分布式系统。
1、Nacos 的命名是由 3 部分组成
组成部分全称描述Nanaming/nameServer即服务注册中心,与 Spring Cloud Eureka 的功能类似。coconfiguration即配置中心,与 Spring Cloud Config+Spring Cloud Bus 的功能类似。sservice即服务,表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的。
1.1、技术升级和替换
前几章节我们介绍了Spring Cloud Netflix套件,今天开始我们升级成使用Spring Cloud Alibaba。
Spring Cloud Alibaba 的 Nacos discovery,会替换掉Spring Cloud Netflix 的 Eureka。
1.2、系统架构图
整个电商微服务架构,选用Spring Cloud Alibaba套件,包括:
- 熔断限流(Spring Cloud Alibaba Sentinel)
- 微服务注册中心(Nacos Discovery)
- 微服务配置(Nacos Discovery Config)
- 微服务调用(Nacos Discovery)
再加上Spring Cloud组件:
- 负载均衡(openFeign)
- 网关(Gateway)
以及:
- 分库分表(Apache ShardingSphere-JDBC)
- 缓存集群(Redis主从)
2、Nacos两大组件
组件描述功能Nacos ServerNacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。––Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。Nacos ClientNacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。––Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。
3、Nacos 实现服务注册与发现的流程如下:
3.1、下载软件
从 Nacos 官方提供的下载页面中,下载 Nacos Server 并运行。
3.2、服务提供者
Nacos Client 启动时,会把服务以服务名(spring.application.name)的方式注册到服务注册中心(Nacos Server)
3.3、 服务消费者
- Nacos Client 启动时,也会将自己的服务注册到服务注册中心;
- 服务消费者在注册服务的同时,它还会从服务注册中心获取一份服务注册列表信息,该列表中包含了所有注册到服务注册中心上的服务的信息(包括服务提供者和自身的信息);
- 在获取了服务提供者的信息后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
4、实战应用
4.1、版本兼容说明
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
4.2、Nacos server安装
下载:
https://github.com/alibaba/nacos/releases/tag/2.0.4
4.3、启动nacos
Nacos Server 下各目录说明如下:
- bin:用于存放 Nacos 的可执行命令。
- conf:用于存放 Nacos 配置文件。
- target:用于存放 Nacos 应用的 jar 包。 进入bin目录,执行启动命令:startup.cmd -m standalone http://localhost:8848/nacos 用户名/密码:nacos/nacos
4.4、工程改造
4.4.1、父pom改造
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.5</version><type>pom</type><scope>import</scope></dependency><!--spring cloud alibaba 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.4.0</version><type>pom</type><scope>import</scope></dependency>
4.4.2、服务提供者改造
- 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.4.0</version></dependency>
- 添加配置
spring:application:name: app-provider-service #服务名cloud:nacos:discovery:server-addr: localhost:8848
- 启动类加注解 @EnableDiscoveryClient 启动应用,查看nacos后台
4.4.3、服务消费者改造
- 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.4.0</version></dependency>
- 添加配置
spring:application:name: app-api-service #服务名cloud:nacos:discovery:server-addr: localhost:8848#Nacos server 的地址
- 启动类添加注解 @EnableDiscoveryClient
4.4.4、 Config配置
创建config文件夹,在下面添加LoadBalancedConfig配置
importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;@ConfigurationpublicclassLoadBalancedConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}
4.4.5、调用者实例
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;importjava.util.Map;@RestController@RequestMapping("/user")publicclassUserController{privatefinalstaticStringSERVER_URL="http://localhost:8080";@AutowiredprivateRestTemplate restTemplate;@GetMapping("/getUserName")publicMapgetUserName(){String url =SERVER_URL+"/user/getUserName";Map map = restTemplate.getForObject(url ,Map.class);
map.put("type","caller");return map;}}
5、集成openFeign
5.1、修改调用方配置文件
5.1.1、增加springcloud依赖
<dependencyManagement><dependencies><!--spring cloud 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.5</version><type>pom</type><scope>import</scope></dependency><!--spring cloud alibaba 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.4.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
5.1.2、增加openFeign依赖项
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>
5.2、调用方代码改造
5.2.1、在启动类增加openFeign配置
@EnableFeignClients
5.2.2、新增服务层接口:UserService
importcom.xxx.common.entity.User;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.GetMapping;@FeignClient(name ="app-provider-service")publicinterfaceUserService{@GetMapping("/user/getUserName")publicUsergetUserName();}
5.2.3、改造控制层方法:
@AutowiredprivateUserService userService;@GetMapping("/getUserName")publicMapgetUserName(){User user = userService.getUserName();Map map =newHashMap();
map.put("code",200);
map.put("data", user);
map.put("type","caller");return map;}
总结
云原生微服务治理有很多手段,但在Java生态里,最主流的还是Spring Cloud Alibaba 、Spring Cloud Netflix。
Spring Cloud文章的前部分已经把Spring Cloud Netflix相关组件讲解且实践过了,这章我们讲解了Spring Cloud Alibaba的Nacos discovery,后续还会继续讲解完Spring Cloud Alibaba其他组件。
版权归原作者 青花锁 所有, 如有侵权,请联系我们删除。