《俗人笔记》之《微服务个人小结三》

Feign

(服务转发优化)
作用就是将rest请求隐藏起来并单独处理,里面包含了ribbon和xystrix,但一般xystrix不用它的依赖
springcloudstarter-openfeign

启动器
可以多加个@EableFeignCilent
但其实只要写一个@springcloudapplication就行,这个就已经包含了springbootapplication,
enableDiscoveryCilent和enableFeignCilent,还有就是干掉restTemplate

配置
没有什么好配置好的,主要是对负载均衡的配置,比如比如关闭服务重试
ribbon:
ConnectTimeout: 1000 # 连接超时时长
ReadTimeout: 2000 # 数据通信超时时长
MaxAutoRetries: 0 # 当前服务器的重试次数
MaxAutoRetriesNextServer: 0 # 重试多少次服务
OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试

编写feigncilent接口客户端
@FeignClient(“user-service”)//指向服务id
public interface UserClient {
@GetMapping("/user/{id}")//具体功能
User queryById(@PathVariable(“id”) Long id);//这要和主方法保持一致,及返回参数和方法参数
}

controller
不再使用restTemplate了,直接注入feigncilent接口就行
@Autowired
private UserClient userClient;

@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
    return userClient.queryById(id);
}

zuul

(安保机制)
用户访问时现在都要经过它,由它向eureka拉取服务列表再向服务调用,它本身也是个服务主要功能就是过滤与路由

依赖
springcloudstarter-ngtflix-zuul
springcloudstarter-ngtflix-eureka-cilent

启动器
只要springbootapplication与enablezuulproxy就行

配置
和其它服务器一样,配置名称和端口,还有就是注册
自己还要配置规则,默认是以服务名称作为映射路径,如果重写,要忽略它
#映射规则

zuul:
  routes:
    user-service: # 这里是路由id,随意写
      path: /user-service/** # 这里是映射路径
      url: http://127.0.0.1:8081 # 映射路径对应的实际url地址
#prefix: /api # 添加路由前缀,可以不加,但加了就要在访问时带上
#strip-prefix:false 这要加上,否则前缀没用

#优化映射规则
zuul:
  routes:
prefix: /api # 添加路由前缀,可以不加,但加了就要在访问时带上
user-service: /user-service/** # 这里是映射路径
  ignored-services:
    - user-service
    - consumer

前提是映射路径规则与服务id一致,但还要注意的是忽略默认以服务id作为映射,
就算重新写映射规则也没用,还是存在默认,所以要忽略掉

过滤器:
自定义过滤器
继承zuulfilter

@Component
public class AuthFilter extends ZuulFilter {

/**
 * 过滤器类型
 * @return
 */
@Override
public String filterType() {
    return PRE_TYPE;
}

/**
 * 过滤器顺序
 * @return
 */
@Override
public int filterOrder() {
    return FORM_BODY_WRAPPER_FILTER_ORDER + 1;
}

/**
 * 要不要执行run
 * @return
 */
@Override
public boolean shouldFilter() {
    return true;
}

/**
 * 过滤逻辑
 * @return
 * @throws ZuulException
 */
@Override
public Object run() throws ZuulException {
    // 获取上下文(每一次请求都会生成一个上下文容器,在整个反向代理过程中共享)
    RequestContext ctx = RequestContext.getCurrentContext();
    // 获取request
    HttpServletRequest request = ctx.getRequest();
    // 获取请求参数中的role
    String role = request.getParameter("role");
    // 判断角色是否是admin
    if(!StringUtils.equals(role, "admin")){
        // 否:拦截
        ctx.setSendZuulResponse(false);// 拦截
        ctx.setResponseStatusCode(401);// 返回未授权 unAuthorized
    }
    // 是:放行
    return null;
}

}
负载均衡和hystrix在zuul也得到集成,我们可以配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 2000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 0

猜你喜欢

转载自blog.csdn.net/qq_33368151/article/details/84934250