- 建module
- 改pom
- 写xml
- 主启动类
- 业务类
是什么
解决了哪些问题
用在哪
怎么用的
即理念和落地的方案
Provider配置类
Application.yml文件:
自身无需注册进Eurake中, 注册其他组件时:
pom中引入spring-cloud-starter-netflix-eureka-server,
其他类中引入spring-cloud-starter-netflix-eureka-client,添加 @EnableEurekaServer和 @EnableEurekaClient注解,yml中添加Eurake配置
Eureka服务注册中心单机变成集群:
服务提供者单机变集群:
docker 中运行zookeeper
docker安装zookeeper后进入查看镜像内部文件的命令
- 查看容器是否启动
docker ps- 进入容器
docker exec -it f76b7e25baa9 /bin/bash- 进入bin目录
cd bin- 登录server
zkCli.sh (-server 127.0.0.1:2181)- 查看目录
ls / , ls /services 查看zookeeper上的服务
服务节点是临时节点
三者异同点
组件名 | 语言 | CAP | 服务健康检查 | 对外暴露接口 | SpringCloud集成 |
---|---|---|---|---|---|
Eureka | Java | AP | 可配支持 | HTTP | 已集成 |
Zookeeper | Java | CP | 支持 | 客户端 | 已集成 |
Consul | Go | CP | 支持 | HTTP/DNS | 已集成 |
Nacos | AP | 支持 |
负载均衡+RestTemplate调用
IRule:根据特定算法从服务列表中选取一个要访问的服务:
修改使用IRule,新建一个包,不能与主配置类在同一包下
在主配置类中添加注解:
负载均衡算法原理: rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始。
CAS 自旋锁 原理+JUC
https://www.bilibili.com/video/bv18b411M7xz/?spm_id_from=333.788.b_636f6d6d656e74.20
本地负载均衡器(P42 手写Ribbon轮询法)
自定义负载均衡类
controller中的方法
Feign是–个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
yml文件
service接口
controller类
主配置类中添加 @EnableFeignClients 注解开启
Feign自带负载均衡配置项
OpenFeign的超时控制
将服务端时间延长,OpenFeign默认等待1s,超时报错,可修改yml
Feign提供了日志打印功能,对Feign接口的调用情况进行监控和输出
解决服务雪崩
服务降级(fallback)、服务熔断(break)、服务限流(flowlimit)、接近实时的监控(Hystrix Dashboard)
Hystrix可放在服务端也可以放在客户端
默认是tomcat 线程池
客户端 e.g.:
主启动类注解:@EnableHystrix
存在的问题:代码与兜底代码膨胀,混乱
#yml:
#开启全局Hystrix配置
feign:
hystrix:
enabled: true
调用失败会触发降级,而降级调用fallback方法,但无论如何,降级的流程一定会先调用正常方法再调用fallback方法,加入单位时间内调用失败次数过多,也就是降级次数过多,则会触发熔断,熔断以后就会跳过正常方法直接调用fallback方法
GateWay基于WebFlux(底层使用高性能Reactor模式的通信框架Netty),基于非阻塞异步模型
动态路由(Route)、断言(Predicate)、过滤器(Filter)
yml配置:
主启动类添加@EnableEurekaClient
负载均衡功能:
断言Predicate:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories
过滤器Filter
方法之前和之后,种类:GateWayFilter和GlobalWayFilter
yml
主配置类 @EnableConfigServer
config 客户端 bootstrap.yml
存在的问题:需要重启才能更新数据
动态更新:
可用广播一次通知处处生效
config服务端和服务端端添加依赖
服务端添加配置 服务端口是15672,客户端口5672(下图有误)
config客户端bootstrap.yml配置
修改后发送
定点更新
即通过微服务名称和端口号
消息中间件MQ可能存在多种,用一种适配绑定的方式,自动在各种MQ之间切换
通过定义绑定器Binder,完美地实现了应用程序和消息中间件细节之间的隔离
生产者
server:
port: 8801
spring:
application:
name: cloud-stream-rabbitmq-provider8801
cloud:
stream:
binders: #此处配置要绑定的rabbitmq的服务信息
defaultRabbit: #表示定义的名称,用于binding的整合
type: rabbit #消息组件的类型
environment: #设置rabbitmq的相关环境配置
spring:
rabbitmq:
host: 123.56.56.183
port: 5672
username: guest
password: guest
bindings: #服务的整合处理
output: #这个名字是一个通道的名称
destination: studyExchange #表示要使用的Exchange名称定义
content-type: application/json #设置消息类型,本次为json,文本则设置“text/plain”
binder: defaultRabbit #设置要绑定的消息服务的具体设置(无视报错)
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 #设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 #如果现在超过了5秒的间隔(默认是90秒)
instance-id: send-8801.com #在信息列表时显示主机名称
prefer-ip-address: true
@EnableBinding(Source.class) // 定义消息的推送管道
public class MsgServiceImpl implements MsgService {
@Autowired
private MessageChannel output; // 消息的发送管道
@Override
public String send() {
String serial = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(serial).build());
System.out.println("*****serial" + serial);
return null;
}
}
消费者
server:
port: 8802
spring:
application:
name: cloud-stream-rabbitmq-consumer8802
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: 123.56.56.183
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
# **与生产者不同**
input: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: receive-8802.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
消费者
@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
@Value("${server.port}")
private String serverPort;
@StreamListener(Sink.INPUT)
public void input(Message<String> msg){
System.out.println("消费者接收得到的消息-->" + msg.getPayload() + " port:" + serverPort);
}
}
分组消费与持久化
存在的问题:
服务端和客户端
# 分布式请求链路追踪
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
#采样率值介于0到1之间,1则表示全部采样
probability: 1
nacos自带负载均衡:已经集成了ribbon,自动轮询
ncaos 支持配置中心动态刷新
nacos作为注册中心
provider 主启动类添加 @EnableDiscoveryClient 注解
provider yml:
server:
port: 9001
spring:
application:
name: cloudalibaba-provider-payment9001
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos地址
management:
endpoints:
web:
exposure:
include: '*'
provider 控制类
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos, serverPort:" + serverPort + "\t id: " + id;
}
}
创建2个provider 9001,9002
consumer 主启动类添加 @EnableDiscoveryClient 注解
consumer yml:
server:
port: 83
spring:
application:
name: alibaba-consumer-order
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://cloudalibaba-provider-payment
consumer 配置类
@Configuration
public class ApplicationContentConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
consumer 控制类
@RestController
@Slf4j
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
}
}
nacos作为配置中心
主启动类添加**@EnableDiscoveryClient**
2个yml:application.yml, bootstrap.yml
bootstrap.yml:
#nacos配置
server:
port: 3377
spring:
application:
name: alibaba-config-client
cloud:
nacos:
# discovery:
# server-addr: localhost:8848 #nacos 服务注册中心地址
config:
# server-addr: localhost:8848 #nacos 作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# namespace: 3ed29772-749b-4b1d-b495-07e4dbb233cb
# group: TEST_GROUP
#${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
application.yml
spring:
profiles:
# active: dev # 表示开发环境
active: test # 表示测试环境
config控制类
@RestController
@RefreshScope // 支持nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return configInfo;
}
}
nacos集群配置和持久化存储
namespace + group + DataID
192.168.107.130:8847
192.168.107.130:8848
192.168.107.130:8849
192.168.163.130:8847
192.168.163.130:8848
192.168.163.130:8849
主启动类添加:@EnableDiscoveryClient
#yml
server:
port: 8001
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssms?serverTimezone=UTC
username: root
password: root
application:
name: ssms-manager
#nacos 配置
cloud:
nacos:
discovery:
server-addr: 192.168.163.130:8888
management:
endpoints:
web:
exposure:
include: '*'