微服务的注册中心
注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系 。在分布式架构中, 服务会注册到这里,当服务需要调⽤其它服务时,就从这里找到服务的地址,进行调用。
注册中心的主要作用:
服务注册中心(下称注册中心)是微服务架构⾮常重要的⼀个组件,在微服务架构⾥主要起到了协调者
的⼀个作⽤。注册中心⼀般包含如下⼏个功能:
- 服务发现:
服务注册/反注册:保存服务提供者和服务调⽤者的信息
服务订阅/取消订阅:服务调⽤者订阅服务提供者的信息,最好有实时推送的功能
服务路由(可选):具有筛选整合服务提供者的能⼒。 - 服务配置:
配置订阅:服务提供者和服务调⽤者订阅微服务相关的配置
配置下发:主动将配置推送给服务提供者和服务调⽤者 - 服务健康检测
检测服务提供者的健康情况
常见的注册中心
**Zookeeper **
zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项目,它主要是⽤来解决分布式应用中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项 的管理等。简单来说zookeeper=⽂件系统+监听通知机制。
**Eureka **
Eureka是在Java语⾔上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件 **Consul **
Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中心分布式⾼可⽤的服务发布和注册服务软件, 采用Raft算法保证服务的⼀致性,且⽀持健康检查。
**Nacos **
Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中⼼心+ 配置中心的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与发现。
Home · Netflix/eureka Wiki · GitHub
在Euraka的GitHub上,宣布Eureka 2.x闭源。
这意味着如果开发者继续使⽤作为 2.x 分⽀上现
有⼯作 repo ⼀部分发布的代码库和⼯件,则将自负风险。
Nacos替换方案
Nacos简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 nacos的作⽤就是⼀个注册中心,用来管理注册上来的各个微服务。
Nacos实战入门
我们就在现有的环境中加入nacos,并将我们的两个微服务注册上去。
搭建nacos环境
①安装nacos:
下载地址: https://github.com/alibaba/nac os/releases
下载zip格式的安装包,然后进⾏解压缩操作
nacos.rar
②启动nacos
#切换⽬录 cd nacos/bin
#命令启动 startup.cmd -m standalone 或者直接双击startup.cmd运行
③访问nacos
打开浏览器输入http://localhost:8848/nacos,即可访问服务,
默认密码是nacos/nacos
将订单微服务注册到nacos
**开始修改 shop-product 模块的代码, 将其注册到nacos服务上 **
①在pom.xml中添加nacos的依赖
<!-- nacos服务注册,服务发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
②在主类上添加@EnableDiscoveryClient注解
package com.stringzhua.shop_order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient//开启nacos服务注册
public class ShopOrderApplication {public static void main(String[] args) {SpringApplication.run(ShopOrderApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
③在application.yml中添加nacos服务的地址
server:port: 8091
spring:application:name: service-orderdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 12345678cloud:nacos:discovery:server-addr: 127.0.0.1:8848
④启动服务, 观察nacos的控制⾯板中是否有注册上来的订单微服务
将商品微服务注册到nacos
开始修改 shop-product 模块的代码, 将其注册到nacos服务上
①在pom.xml中添加nacos的依赖
<!-- nacos服务注册,服务发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
②在主类上添加@EnableDiscoveryClient注解
package com.stringzhua.shop_product;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient//开启nacos服务注册
public class ShopProductApplication {public static void main(String[] args) {SpringApplication.run(ShopProductApplication.class, args);}}
③在application.yml中添加nacos服务的地址
server:port: 8081
spring:application:name: service-productdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 12345678cloud:nacos:discovery:server-addr: 127.0.0.1:8848
④启动服务, 观察nacos的控制⾯板中是否有注册上来的商品微服务
实现下单:
项目完整源码:
springcloud_alibaba_nacos.rar
Nacos配置管理
Nacos除了可以做注册中心,同样可以做配置管理来使用
统一配置管理
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让⼈抓狂,而且很容易出错。我们需要⼀种统⼀配置管理⽅案,可以集中管理所有实例的配置。
Nacos⼀⽅面可以将配置集中管理,另⼀方可以在配置变更时,及时通知微服务,实现配置的热更新。
在业界常见的服务配置中心,有下⾯这些:
- Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进⾏版本管理、操作审计等功能,提供开放平台API。 并且资料也写的很详细。
- Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。
- SpringCloud Config这是Spring Cloud中带的配置中心组件。它和Spring是⽆缝集成,使用起来非常方便,并且它的配置存储⽀持Git。不过它没有可视化的操作界⾯,配置的生效也不是实时的,需要重启或去刷新。
- Nacos这是SpingCloud alibaba技术栈中的⼀个组件,前⾯我们已经使⽤它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使⽤它作为服务配置中心。
在nacos中添加配置文件
注意:项目的核⼼配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的⼀些配置还是保 存在微服务本地比较好。
从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项⽬启动。 但如果尚未读取application.yml,⼜如何得知nacos地址呢?
因此spring引⼊了⼀种新的配置⽂件: bootstrap.yaml⽂件,会在application.yml之前被读取,流程如下:
配置的实现步骤
引入nacos-config依赖
<!-- nacos服务注册,服务发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在商品和订单服务都添加坐标:
添加bootstrap.yaml
不能使用原来的application.yml作为配置⽂件,而是新建⼀个bootstrap.yml作为配置⽂件
配置文件优先级(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中⼼地址file-extension: yaml #配置⽂件格式profiles:active: dev # 环境标识,开发环境
在nacos中添加配置
测试
配置热更新
我们最终的目的,是修改nacos中的配置后,微服务中⽆需重启即可让配置⽣效,也就是配置热更新。要实现配置热更新,可以使用两种⽅式:
配置中心添加配置:
config:appName: "猫猫头"env: dev
方式一
在@Value注⼊的变量所在类上添加注解@RefreshScope:
@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController01 {@Value("${config.appName}")private String appName;@GetMapping("/config1")public String Config01() {return appName;}
}
如果修改的话,不需要重启服务,直接在nacos配置中心修改即可:
方式二
硬编码方式:
@RestController
public class NacosConfigController02 {@Autowiredprivate ConfigurableApplicationContext applicationContext;@GetMapping("config2")public String Config02() {return applicationContext.getEnvironment().getProperty("config.appName");}
}
测试:
配置共享
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置文件提取出来
同服务内配置共享
实现步骤:
- 新建⼀个以 spring.application.name 命名的配置⽂件,然后将其所有环境的公共配置放在里面
- 新建⼀个名为service-product-test.yaml配置存放测试环境的配置
- 新建⼀个名为service-product-dev.yaml配置存放开发环境的配置
- 在两个环境⽂件中配置独有信息
- 添加测试⽅法
@Value("${config.env}")
private String env;//同一微服务的不同环境下共享配置
@GetMapping("/env")
public String nacosConfingTest2() {return env;
}
测试dev:
测试test:
不同微服务共享配置
不同服务之间实现配置共享的原理类似于⽂件引入,就是定义⼀个公共配置,然后在当前配置中引入
- 在nacos中定义⼀个DataID为datasource.yaml的配置,用于所有微服务共享
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 12345678
- 修改bootstrap.yaml
spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置文件格式shared-dataids: datasource.yaml # 配置要引⼊的配置refreshable-dataids: datasource.yaml # 配置要实现动态配置刷新的配置profiles:active: dev # 环境标识,开发环境
- 启动商品微服务进⾏测试
配置共享的优先级
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
服务名-proflie.yaml -> 服务名称.yaml -> 本地配置.yaml