1. Eureka 服务治理
Eureka服务器搭建
Eureka 解决了 微服务治理问题,因为相互调用之间十分复杂
服务注册和发现
- 1.创建一个maven项目
- 2.pom.xml添加对应的依赖
- 3.引导类上添加对应的启动注解
- 4.配置文件中添加对应的配置信息
- 5.其他
父工程pom文件
1 | <!--spring boot 环境 --> |
创建 eureka-server
eureka-server pom文件
1 | <dependencies> |
引导类
1 |
|
配置文件
1 | server: |
Eureka客户端搭建
pom需要引入client依赖
1 | <!-- eureka-client --> |
引导类
1 |
|
配置文件
1 | server: |
1.搭建消费者和生产者服务
2.使用RestTemplate完成远程调用
需要编写配置类
```java
@Configuration
public class RestTemplateConfig {@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 远程调用
- ```java
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/findOrderById/{id}")
public Goods findOrderById(@PathVariable("id") int id){
String url = "http://localhost:8000/goods/findOne/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);
return goods;
}
3.搭建Eureka Server 服务
4.改造消费者和生产者为Eureka Client
5.消费者服务通过从Eureka Server 中抓取 生产者地址 完成远程调用
1
2
3
4
5
6
7
8
9
//添加此注解
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}@RestController @RequestMapping("/order") public class OrderController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/findOrderById/{id}") public Goods findOrderById(@PathVariable("id") int id) { List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-PROVIDER"); //判断集合是否有数据 if (instances == null || instances.size() == 0) { //集合没有数据 return null; } ServiceInstance instance = instances.get(0); String host = instance.getHost(); int port = instance.getPort(); //动态获取路径 System.out.println(host); System.out.println(port); String url = "http://"+host+":"+port+"/goods/findOne/" + id; Goods goods = restTemplate.getForObject(url, Goods.class); return goods; }
#### Eureka 高可用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
##### 配置文件 基础配置
```yml
server:
port: 9000
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true #将当前实例的ip注册到eureka中,默认为false,注册主机名
ip-address: 127.0.0.2 # 设置当前的实例ip,可任意设置
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-consumer
- 准备两个eureka-server
- 分别进行配置,互相进行注册
- eureka-client 分别注册到这两个eureka-server中
eureka-server1
1 | server: |
eureka-server2
1 | server: |
2. Consul 服务治理
1 | # 启动命令 |
- 搭建provider和consumer服务
- 使用restTemplate 完成远程调用
- 将provider注册到Consul中
- Consumer服务通过从Consul中抓取Provider地址完成远程调用
3. Nacos 服务治理
- 注册中心 + 配置中心
4. Ribbom 客户端负载均衡
问题:简化远程调用,实现了负载均衡 ,但是在进行远程调用的时候不够优雅
- 概述:Ribbom是Nieflix提供的一个基于Http和Tcp的客户端负载均衡工具
使用Ribbon简化restTemplate调用
1.在声明restTemplate的Bean的时候,添加一个注解:@LoadBalanced
@Configuration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
##### Ribbon负载均衡策略1
2
3
4
5
6
7
8
9
10
11
12
- 2.在使用restTemplate发起请求时,需要定义url,host:port可以直接替换为 服务提供方的 应用名称
- ```java
@RequestMapping("/findOrderById/{id}")
public Goods findOrderById(@PathVariable("id") int id) {
String url = "http://EUREKA-PROVIDER/goods/findOne/" + id;
Goods goods = restTemplate.getForObject(url, Goods.class);
return goods;
}
- 编写配置类实现负载均衡策略
- yml里面可以直接配置负载均衡策略
- 随机
- 轮询
- 最小并发
- 过滤:过滤掉坏的节点,过滤掉慢的节点
- 响应时间:先会分别发一个小数据包,那个响应时间快就选那个
- 轮询重试:默认十次
- 性能可用性:会对节点进行总会得分,那个分高选用那个
5. Feign 声明式服务调用
像调用本地方法一样进行远程调用,足够优雅
声明式的rest客户端,基于接口的注解方式,很方便实现客户端配置
feign不支持springMVC注解,一般使用springCloud包装过的openFeign
6. Hystrix 熔断器
问题:解决 雪崩效应
Hystrix隔离
- 默认线程池隔离
- 信号量隔离
Hystric 降级
当服务发生异常或调用超时,返回默认数据
服务方降级 和 客户方降级
Hystric 熔断
- 关闭
- 打开
- 半开
- 5秒20次请求 50%的失败就会进行熔断,然后半开,释放一条请求,成功了的话就打开
7. Gateway
问题:路由分发,过滤拦截
Gateway网关路由配置
Gateway过滤器
- 概念:对请求或相应进行拦截,完成一些通用操作
- 局部过滤器
- 关键类:GatewayFilterFactory
- 全局过滤器
- 管件类:GloabFilter Ordered
8. Config分布式配置中心
问题:随着微服务的节点越来越多,节点中会出现非常多的相同配置代码,出现配置重复
解决了分布式场景下多环境配置文件的管理和维护
- 准备一个存储文件的位置(Gitee)
- config-server config-client
9. Bus 消息总线
问题:当配置文件发生变化后,使用Mq来完成消息的发送与接受,最终使
10 Stream 消息驱动(了解)
- 一个构建消息驱动微服务应用的框架
- 解决了开发人员无感知的使用消息中间件的问题
11 Sleuth + Zipkin 链路追踪(工具)
定位微服务中的错误,比如请求
- 跟踪用户请求的过程,捕获追踪数据,构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具
- 耗时分析
- 可视化错误
- 链路优化