微服务
1.SpringCloud中的核心组件
Spring Cloud Netflix组件
组件名称 | 作用 |
---|---|
Eureka | 服务注册中心 |
Ribbon | Ribbon |
Feign | 声明式服务调⽤ |
Hystrix | 客户端容错保护 |
Zuul | API服务⽹关 |
Spring Cloud Alibaba组件
组件名称 | 作用 |
---|---|
Nacos | 服务注册中心 |
Sentinel | 客户端容错保护 |
Spring Cloud原⽣及其他组件
组件 | 作用 |
---|---|
Consul | 服务注册中心 |
Config | 分布式配置中心 |
Gateway | API服务网关 |
Sleuth/Zipkin | 分布式链路追踪 |
2.服务调用
2.1RestTemplate介绍
Spring框架提供的RestTemplate类可⽤于在应⽤中调⽤rest服务,它简化了与http服务的通信⽅式,统⼀了RESTful的标准,封装了http链接, 我们只需要传⼊url及返回值类型即可。相较于之前常⽤的HttpClient ,RestTemplate是⼀种更优雅的调⽤RESTful服务的⽅式。
2.2RestTemplate方法介绍
2.3通过RestTemplate调用微服务
在 shop_order⼯程中配置RestTemplate
//配置RestTemplate交给spring管理
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
3.注册中心
3.1注册中心的主要作用
服务注册中⼼(下称注册中⼼)是微服务架构⾮常重要的⼀个组件,在微服务架构⾥主要起到了协调者的⼀个作⽤。注册中⼼⼀般包含如下⼏个功能:
- 服务发现:
● 服务注册/反注册:保存服务提供者和服务调⽤者的信息
● 服务订阅/取消订阅:服务调⽤者订阅服务提供者的信息,最好有实时推送的功能
● 服务路由(可选):具有筛选整合服务提供者的能⼒。
- 服务配置:
● 配置订阅:服务提供者和服务调⽤者订阅微服务相关的配置
● 配置下发:主动将配置推送给服务提供者和服务调⽤者
- 服务健康检测
● 检测服务提供者的健康情况
3.2常见的注册中心
Zookeeper
zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。简单来说zookeeper=⽂件系统+监听通知机制。
Eureka
Eureka是在Java语⾔上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件
Eureka闭源影响:
在Euraka的GitHub上,宣布Eureka 2.x闭源。近这意味着如果开发者继续使⽤作为 2.x 分⽀上现有⼯作repo ⼀部分发布的代码库和⼯ 件,则将⾃负⻛险
Consul
Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采⽤Raft算法保证服务的⼀致性,且⽀持健康检查。
Nacos
Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中⼼ + 配置中⼼的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与发现。
组件名 | 语言 | CAP | 致性算法 | 服务健康检查 | 对外暴露接口 |
---|---|---|---|---|---|
Eureka | Java | AP | ⽆ | 可配⽀持 | HTTP |
Consul | Go | CP | Raft | ⽀持 | HTTP/DNS |
Zookeeper | Java | CP | Paxos | ⽀持 | 客户端 |
Nacos | Java | AP | Raft | ⽀持 | HTTP |
3.3 nacos简介
Nacos 致⼒于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易⽤的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 nacos的作⽤就是⼀个注册中⼼,⽤来管理注册上来的各个微服务
3.3.1nacos实战入门
1.搭建nacos环境、安装
下载地址: https://github.com/alibaba/nacos/releases
下载zip格式的安装包,然后进⾏解压缩操作
2.启动nacos
#切换⽬录
cd nacos/bin
#命令启动
startup.cmd -m standalone
或者直接双击startup.cmd运⾏
3.访问nacos
打开浏览器输⼊http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos
3.4 Ribbon
3.4.1 什么是Ribbon
它是 Netflixfa 发布的⼀个负载均衡器,有助于控制 HTTP 和 TCP客户端⾏为。在 SpringCloud 中,Nacos⼀般配合Ribbon进⾏使⽤,Ribbon提供了客户端负载均衡的功能,Ribbon利⽤从Nacos中读取到的服务信息,在调⽤服务节点提供的服务时,会合理的进⾏负载。在SpringCloud中可以将注册中⼼和Ribbon配合使⽤,Ribbon⾃动的从注册中⼼中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务.
3.4.3 Ribbon作用
(1)服务调⽤
基于Ribbon实现服务调⽤, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助RestTemplate 最终进⾏调⽤
(2)负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法⾃动的选择需要调⽤的服务地址
3.4.4 Ribbon应用
1.在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这⾥不需要导⼊任何额外的坐标
⽅式1:定义⼀个新的IRule:(全局设置)
@Bean
public IRule randomRule(){
return new RandomRule();
}
⽅式2:在yml配置⽂件中配置:(局部设置)
#需要调⽤的微服务名称
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3.5 Nacos配置管理
执行流程:
配置实现步骤:
1.引⼊nacos-config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.添加bootstrap.yaml
不能使⽤原来的application.yml作为配置⽂件,⽽是新建⼀个bootstrap.yml作为配置⽂件
配置⽂件优先级(由⾼到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
具体配置:
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中⼼地址
file-extension: yaml # 配置⽂件格式
profiles:
active: dev # 环境标识,开发环境
3.在nacos中添加配置
配置热更新:
config:
appName: product
方式一:在@Value注⼊的变量所在类上添加注解@RefreshScope:
@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
@Value("${config.appName}")
private String appName;
@GetMapping("/nacos-config-test1")
public String nacosConfingTest1() {
return appName;
}
}
方式二:硬编码⽅式
@RestController
public class NacosConfigController {
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/nacos-config-test2")
public String nacosConfingTest2() {
return applicationContext.getEnvironment().getProperty("config.app
Name");
}
}
4.配置共享:
(1)同服务内配置共享:
1. 新建⼀个以 spring.application.name 命名的配置⽂件,然后将其所有环境的公共配置放在⾥⾯
2. 新建⼀个名为service-product-test.yaml配置存放测试环境的配置
3. 新建⼀个名为service-product-dev.yaml配置存放开发环境的配置
4. 在两个环境⽂件中配置独有信息
#多配置⼀段
config:
env: test
#多配置⼀段
config:
env: dev
测试方法:
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${config.env}")
private String env;
//3 同⼀微服务的不同环境下共享配置
@GetMapping("/nacos-config-test3")
public String nacosConfingTest3() {
return env;
}
}
(2)不同服务内配置共享:
1. 在nacos中定义⼀个DataID为all-service.yaml的配置,⽤于所有微服务共享
all-service.yaml配置:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///shopserverTimezone=UTC
username: root
password: root
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
2. 修改bootstrap.yaml
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中⼼地址
file-extension: yaml # 配置⽂件格式
shared-dataids: all-service.yaml # 配置要引⼊的配置
refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
profiles:
active: dev # 环境标识
5.配置共享的优先级:
当nacos、服务本地同时出现相同属性时,优先级有⾼低之分:
服务名-profile.yaml(当前配置环境)>服务名称.yaml>本地配置
总结:
本文详细介绍了 Spring Cloud 微服务架构中的核心组件,包括 Spring Cloud Netflix 组件(Eureka、Ribbon、Feign、Hystrix、Zuul)、Spring Cloud Alibaba 组件(Nacos、Sentinel)以及 Spring Cloud 原生及其他组件(Consul、Config、Gateway、Sleuth/Zipkin)。重点阐述了服务调用中 RestTemplate 的作用和使用方法,以及注册中心的主要作用和常见的注册中心(Zookeeper、Eureka、Consul、Nacos),并对 Nacos 进行了深入介绍,包括其搭建、作用以及在配置管理方面的实战应用,如配置热更新、配置共享及配置共享的优先级等。