十次方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)集中处理权限问题

解释为什么使用集中配置管理
将配置文件放到云端,方便后期维护
解释为什么使用消息总线
我们可以在不重启微服务的情况下,更新配置文件,让其立刻生效

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的小巍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值