SpringBoot+Cloud全家桶微服实战项目八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)集中处理权限问题

解释为什么使用集中配置管理

将配置文件放到云端,方便后期维护

解释为什么使用消息总线

我们可以在不重启微服务的情况下,更新配置文件,让其立刻生效

---------------------

作者:wangwei_620

来源:CSDN

原文:https://blog.csdn.net/wangwei_620/article/details/87623815

版权声明:本文为博主原创文章,转载请附上博文链接!

举报
评论 0