欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十次方day08(SpringCloud之一统天下)

程序员文章站 2022-04-29 20:59:48
...

一.熔断器Hystrix

概念:Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

应用场景:

十次方day08(SpringCloud之一统天下)

Feign调用接口产生代理类,然后发送http请求,如果目标微服务不可用,http请求会等待超时情况,正常情况下熔断器关闭,如果目标微服务不可用,则会导致调用者不可用,与之关联的就都不可用,可能发生系统瘫痪

十次方day08(SpringCloud之一统天下)

需求分析:目标微服务不可用,我们采用熔断器处理

1.首先开发Hystrix的支持

通过配置文件实现

2.创建Feign接口的实现类,在接口中指定那个微服务不可调用那个实现类

3.测试

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

测试:

十次方day08(SpringCloud之一统天下)

如果不开器熔断器,则会等待着http响应超时

二.微服务网关zuul

1.为什么要使用网关?

一个app有多个微服务端口,前端在调用的时候,也会出现维护多个端口和ip地址,认证也很复杂,每一个服务都需要独立认证,难以重构,上述的问题我们可以采用,微服务网关同一解决.

2.Zuul?

Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
# 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
#审查与监控:
## 动态路由:动态将请求路由到不同后端集群
# 压力测试:逐渐增加指向集群的流量,以了解性能
# 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
# 静态响应处理:边缘位置进行响应,避免转发到内部集群
# 多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化

十次方day08(SpringCloud之一统天下)

网关两个非常重要的作用:

路由转发 (请求和目标微服务之间的映射)

过滤器(前端请求的微服务我们可以做校验工作)

十次方day08(SpringCloud之一统天下)

后天网关搭建:

1.创建后台微服务网关

2.映入相关依赖,zuul相关

3.将微服务注册到Eureka

4.配置Zuul路由转发

十次方day08(SpringCloud之一统天下)

配置启动类

十次方day08(SpringCloud之一统天下)

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

十次方day08(SpringCloud之一统天下)

配置过滤器:

@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地址和端口号

是前台进行搜索的

前台网关我们配置一个过滤器用来转发请求头

十次方day08(SpringCloud之一统天下)

三.集中配置组件SpringCloudConfig

简介:

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloudconfig ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是configclient。
Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置文件内容,也可以使用SVN存储,或者是本地文件存储。
Config Client是Config Server的客户端,用于操作存储在Config Server中的配置内容。微服务在启动时会请求Config Server获取配置文件的内容,请求到后再启动容器。

十次方day08(SpringCloud之一统天下)

1、将微服务配置文件上传到github,gitee

2、注册gitee账户

3、将项目中配置文件上传到gitee仓库中

**将项目配置文件改名  规范:{应用名称}-{环境类型}.yml 不能使用下划线

**将项目中存放配置文件删除

**在项目中新建配置文件bootstrap.yml

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

配置客户端

十次方day08(SpringCloud之一统天下)

配置文件:

十次方day08(SpringCloud之一统天下)

启动基础微服务测试:

如果启动成功就可以

四.消息总线SpringCloudBus

如果我们更新码云中的配置文件,那客户端工程是否可以及时接受新的配置信息
呢?我们现在来做有一个测试,修改一下码云中的配置文件中mysql的端口 ,然后测试
http://localhost:9001/label 数据依然可以查询出来,证明修改服务器中的配置并没有更
新立刻到工程,只有重新启动程序才会读取配置。 那我们如果想在不重启微服务的情况
下更新配置如何来实现呢? 我们使用SpringCloudBus来实现配置的自动更新。

十次方day08(SpringCloud之一统天下)

开发步骤:

1.在配置中心映入相关的依赖

2.设置触发消息总线

3.通过post方式进行请求,

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

我们通过postman进行请求:

客户端配置:

我们只需要添加依赖就可以了

十次方day08(SpringCloud之一统天下)

这样我们就可以通过rabbitMQ的队列中获配置文件了

自定义配置文件:

我们可以在码云上修改配置文件,那么我们可以通过在本地编写一个controller进行测试是否能通过刷新消息总线的来从队列中获得配置文件.

十次方day08(SpringCloud之一统天下)

十次方day08(SpringCloud之一统天下)

然后我们进行测试

五.面试常问

解释雪崩效应,为什么要使用熔断器
解释为什么使用微服务网关
(1)微服务工程统一入口,方便前端调用
(2)集中处理权限问题

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