三步走
1、搭springboot项目 引入启动器
2、覆盖默认配置
3、springboot的引导类上加上注解,告诉eureka是服务还是客户端
什么是SpringCloud?
是一套微服务架构的解决方案,是很多组件的集合。
Eureka:注册中心 服务注册和发现服务
Ribbon:负载均衡
Hystrix:熔断组件
Feign:基于Http远程调用组件
Zuul:网关 请求鉴权 服务路由 过滤器
一、Eureka
注册中心:eureka-server
1、引入服务端启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、配置应用名spring.application.name=eureka-server
注册地址
eureka:
client:
service-url:
defaultZone: http://localhost:端口/eureka
3、在引导类上加上注解@EnableEurekaServer
客户端:service-provider service-consumer
1、引入客户端启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、配置应用名spring.application.name=service-provider
从哪个注册地址获取服务ip列表
eureka:
client:
service-url:
defaultZone: http://localhost:10089/eureka
3、在引导类上加注解@EnableEurekaClient(eureka提供) 或 @EnableDiscoveryClient(推荐使用:springcloud提供)
二、Ribbon
1、正常是引入启动类,但是ribbon已经被Eureka集成了,所以ribbon不用再单独引入启动类
2、在引导类中注册的RestTemplate工具类上加注解@LoadBalanced(负载均衡)
3、修改调用方式,用服务名去调用
由原来的固定ip调用User user = restTemplate.getForObject("http://"+host+":"+port+"/user/" + id, User.class);
改造为负载均衡调用User user = restTemplate.getForObject("http://service-provider/user/" + id, User.class);
三、Hystrix
降级:检查每次的请求, 是否请求超时 或 连接池已满
1、引入启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、在引导类上加注解@EnableCircuitBreaker
3、定义降级方法:
局部:降级方法要和被降级方法的入参和返回值都保持一致,方法名可以任意,但是要见名知意
全局:降级方法返回值和被降级方法的返回值保持一致,入参必须为空(因为能用的降级方法会被多个方法使用,多个方法无法保证入参一致),方法名可以任意,但是要见名知意
4、使用
局部:在被降级方法上加上注解@HystrixCommand(fallbackMethod="局部降级方法名"),要在注解内指定降级方法名
全局:在被降级的类上加注解@DefaultProperties(defaultFallback="全局降级方法名") 并且要在 降级的方法上加上注解@HystrixCommand
熔断:如果失败请求次数达到阈值(默认最低20次,50%失败率)不再发送请求到服务端
1、close:熔断闭合状态, 所有发送请求都能正常送达 (没有开启熔断)
2、open:熔断打开状态, 所有请求都无法发送到达 (开启了熔断,就像保险丝被烧断了)
3、half open:熔断半开状态,在打开状态状态默认5s后,过了熔断打开状态的休眠期后,进入到的状态,会放过去部分请求:
如果放过到请求全部健康返回,则将状态切换为close熔断关闭状态(所有请求都正常放行);
如果放过的请求没有健康正常返回,则将状态切换为open熔断打开状态
四、Feign
1、引入OpenFeign启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在引导类上加注解@EnableFeignClients
3、定义接口,在接口上加注解@FeignClient(value = "service-provider", fallback=UserClientFallback.class, configuration = FeignConfig.class) //标注了一个feign接口
4、接口定义要求:入参和出参必须和调用的目标方法接口保持一致,类似于之前的controller,将uri写到方法上@GetMapping("/user/{id}")
5、开启熔断:
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
6、创建一个熔断降类,实现feign接口,实现对应的方法,方法中写降级内容
五、Zuul
1、引入启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2、配置路由规则
1、zuul.routes.服务路由的名称.path=/service-provider/**
zuul.routes.服务路由的名称.url=http://127.0.0.1:8081
2、zuul.routes.服务路由的名称.path=/service-provider/**
zuul.routes.服务路由的名称.serviceId=service-provider
3、zuul.routes.服务名称=/service-provider/** 简写版,推荐使用
4、不配,即默认配置,默认情况,每个微服务的服务名,即是访问映射地址
3、在引导类加注解@EnableZuulProxy
4、zuul过滤器
自定义的过滤器继承顶级父类
public abstract ZuulFilter implements IZuulFilter{
//过滤类型 pre route post error
abstract public String filterType();
//优先级 数字越小优先级越高 建议留下可扩展空间 为什么会有:有多个过滤器时,如果返回的过滤类型filterType都相同,则需要配置优先级
abstract public int filterOrder();
//true表示会运行run方法 false不运行run方法
boolean shouldFilter();// 来自IZuulFilter
//真正实现的业务逻辑
Object run() throws ZuulException;// IZuulFilter
}