十次方day08(SpringCloud之一统天下)
一.熔断器Hystrix
概念:Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。
应用场景:
Feign调用接口产生代理类,然后发送http请求,如果目标微服务不可用,http请求会等待超时情况,正常情况下熔断器关闭,如果目标微服务不可用,则会导致调用者不可用,与之关联的就都不可用,可能发生系统瘫痪
需求分析:目标微服务不可用,我们采用熔断器处理
1.首先开发Hystrix的支持
通过配置文件实现
2.创建Feign接口的实现类,在接口中指定那个微服务不可调用那个实现类
3.测试
测试:
如果不开器熔断器,则会等待着http响应超时
二.微服务网关zuul
1.为什么要使用网关?
一个app有多个微服务端口,前端在调用的时候,也会出现维护多个端口和ip地址,认证也很复杂,每一个服务都需要独立认证,难以重构,上述的问题我们可以采用,微服务网关同一解决.
2.Zuul?
Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
# 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
#审查与监控:
## 动态路由:动态将请求路由到不同后端集群
# 压力测试:逐渐增加指向集群的流量,以了解性能
# 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
# 静态响应处理:边缘位置进行响应,避免转发到内部集群
# 多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化
网关两个非常重要的作用:
路由转发 (请求和目标微服务之间的映射)
过滤器(前端请求的微服务我们可以做校验工作)
后天网关搭建:
1.创建后台微服务网关
2.映入相关依赖,zuul相关
3.将微服务注册到Eureka
4.配置Zuul路由转发
配置启动类
server:
port: 9012
spring:
application:
name: tensquare-gateway-management #指定服务名
eureka:
client:
service-url:
defaultZone: http://localhost:6868/eureka
zuul:
routes:
tensquare-base:
path: /base/**
serviceId: tensquare-base
tensquare-friend:
path: /friend/**
serviceId: tensquare-friend
tensquare-qa:
path: /qa/**
serviceId: tensquare-qa
tensquare-gathering:
path: /gathering/**
serviceId: tensquare-gathering
tensquare-recruit:
path: /recruit/**
serviceId: tensquare-recruit
tensquare-user:
path: /user/**
serviceId: tensquare-user
tensquare-article:
path: /article/**
serviceId: tensquare-article
tensquare-spit:
path: /spit/**
serviceId: tensquare-spit
配置过滤器:
@Component
public class ManagerZuulFilter extends ZuulFilter{
@Autowired
private JwtUtil jwtUtil;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String requestURL = request.getRequestURL().toString();
if(requestURL.contains("/login")){
return false;
}
return true;
}
/**
* 调用后台微服务网关,除了登陆请求外 ,都需要要求当前用户token正确,角色必须管理员
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
//验证token是否有效
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String header = request.getHeader("Authorization");
if(!StringUtils.isEmpty(header) && header.startsWith("Bearer ")){
String token = header.substring(7);
Claims claims = jwtUtil.parseToken(token);
if(claims!=null && claims.get("role").equals("admin")){
//才可以将请求转发到后边微服务
currentContext.addZuulRequestHeader("Authorization", header);
return null;
}
}
//权限不足,不在进行路由转发到微服务
Result result = new Result(false, StatusCode.ACCESSRROR, "权限不足!");
currentContext.setSendZuulResponse(false); //停止转发
currentContext.setResponseStatusCode(401); //设置状态码
currentContext.setResponseBody(JSON.toJSONString(result));
HttpServletResponse response = currentContext.getResponse();
response.setContentType("text/json;charset=utf-8");
return null;
}
启动进行测试,通过访问localhost:9011/user/admin可以查询到
前台网关搭建相同的步骤:
只不过在配置文件中多了一个ip地址和端口号
是前台进行搜索的
前台网关我们配置一个过滤器用来转发请求头
三.集中配置组件SpringCloudConfig
简介:
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloudconfig ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是configclient。
Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置文件内容,也可以使用SVN存储,或者是本地文件存储。
Config Client是Config Server的客户端,用于操作存储在Config Server中的配置内容。微服务在启动时会请求Config Server获取配置文件的内容,请求到后再启动容器。
1、将微服务配置文件上传到github,gitee
2、注册gitee账户
3、将项目中配置文件上传到gitee仓库中
**将项目配置文件改名 规范:{应用名称}-{环境类型}.yml 不能使用下划线
**将项目中存放配置文件删除
**在项目中新建配置文件bootstrap.yml
配置客户端
配置文件:
启动基础微服务测试:
如果启动成功就可以
四.消息总线SpringCloudBus
如果我们更新码云中的配置文件,那客户端工程是否可以及时接受新的配置信息
呢?我们现在来做有一个测试,修改一下码云中的配置文件中mysql的端口 ,然后测试
http://localhost:9001/label 数据依然可以查询出来,证明修改服务器中的配置并没有更
新立刻到工程,只有重新启动程序才会读取配置。 那我们如果想在不重启微服务的情况
下更新配置如何来实现呢? 我们使用SpringCloudBus来实现配置的自动更新。
开发步骤:
1.在配置中心映入相关的依赖
2.设置触发消息总线
3.通过post方式进行请求,
我们通过postman进行请求:
客户端配置:
我们只需要添加依赖就可以了
这样我们就可以通过rabbitMQ的队列中获配置文件了
自定义配置文件:
我们可以在码云上修改配置文件,那么我们可以通过在本地编写一个controller进行测试是否能通过刷新消息总线的来从队列中获得配置文件.
然后我们进行测试
五.面试常问
解释雪崩效应,为什么要使用熔断器
解释为什么使用微服务网关
(1)微服务工程统一入口,方便前端调用
(2)集中处理权限问题
解释为什么使用集中配置管理
将配置文件放到云端,方便后期维护
解释为什么使用消息总线
我们可以在不重启微服务的情况下,更新配置文件,让其立刻生效