发表于: 2020-07-03 23:48:14

1 1661


今天完成的事情:






在微服务架构中,一个请求需要调用多个服务是非常常见的。

但运行过程中,如果某个较底层的服务如果出现故障,会导致连锁故障。

当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开,用来避免连锁故障。

fallback方法可以直接返回一个固定值。只返回固定的结果。



ribbon 熔断处理


启动类加注解


controller加注解





断开客户端  熔断处理结果






fogin  熔断处理


配置文件
#开启熔断功能
feign:
hystrix:
enabled: true


加入熔断处理的类


熔断处理类
//熔断处理的类 需要继承 HelloService接口
@Component
public class ErrorHandler implements HelloService{
@Value("${server.port}")
private String port;
@Override
public String obtainOtherServerJsonData(String name) {
return "sorry " + name + " , " + port + " server internal error";
}
}



断开一个客户端连接 







搭建了熔断处理仪表盘





具体含义




zuul路由转发


在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。




Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。


#找到注册中心的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#当前项目准备部署的端口
server:
port: 8769
#当前项目的服务器名称
spring:
application:
name: service-zuul
#配置网关路由
zuul:
routes:
api-a:
#/api-ribbon/**请求转发到service-ribbon服务器
     path: /api-ribbon/**
serviceId: service-ribbon
api-b:
#/api-feign/**请求转发到service-feign服务器
     path: /api-feign/**
serviceId: service-feign


启动类加上


这这样访问

api-ribbon/**

api-fegin/**

就会转发给 ribbon (服务端负载均衡/熔断等功能) 和 fegin(同)处理



zuul还有拦截器的功能



一个完整的拦截器   需要继承zuulFilter接口

实现所有的方法

方法具体的含义  代码上方已注释


//        filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
//                pre:路由之前
//                routing:路由之时
//                post: 路由之后
//                error:发送错误调用

//        filterOrder:过滤的顺序,越小优先级越高

//        shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。

//        run:过滤器的具体逻辑。
//

@Component
public class SecurityFilter extends ZuulFilter {

   @Override
   public String filterType() {
       //pre路由之前
       //routing:路由之时
       // post: 路由之后
       // error:发送错误调用
       return "pre";
   }

   @Override
   public int filterOrder() {
       return 0;
   }

   @Override
   public boolean shouldFilter() {
       //true表示拦截
       return true;
   }

   @Override
   public Object run() {
       //获取RequestResponse接口对象
       RequestContext ctx = RequestContext.getCurrentContext();
       HttpServletRequest request = ctx.getRequest();
       String securityToken = request.getParameter("token");
       if (securityToken == null) {
           ctx.setSendZuulResponse(false);
           //状态码
           ctx.setResponseStatusCode(401);
           try {
               //返回响应
               ctx.getResponse().getWriter().write("request failure , you do not have security token ");
           } catch (Exception e) {
           }
       }

       //return null 表示直接越过此Filter
       return null;
   }

}


如果你请求头不带token


就会返回错误   401   自定义错误

如果带token   就跳过此拦截器




明天计划的事情:


完成剩余模块及任务




返回列表 返回列表
评论

    分享到