源码:Service routing with Spring Cloud and Zuul
前言
同样像之前一样吧postgres开起来备用。配置服务记得改成本地的环境,尤其是组织服务,要配一下:
组织表也要创建。sql在组织服务里找。
配置文件用本地查找模式:
一、在Zuul中配置路由
小笔记:一般用Zuul和Eureka集成时,用@EnableZuulProxy,还有个注解叫@EnableZuulServer,使用它将创建一个Zuul服务器,它不会加载任何Zuul反向代理过滤器,也不会使用Eureka进行服务发现,与其他服务发现引擎(比如Consul)集成时才用它。
二、在Zuul中配置路由
三种机制:
- 使用服务发现自动映射路由
- 使用服务发现手动映射路由
- 使用静态URL手动映射路由
1.通过服务发现自动映射路由
这个不需要配置:URL/服务ID/具体路径即可。
验证一下,首先开启Eureka,,然后配置服务,然后其他服务,然后开启Zuul服务。
2.使用服务发现手动映射路由
小笔记:在使用自动路由映射时,Zuul只基于Eureka服务ID来公开服务,如果服务的实例没有在运行,Zuul将不会公开该服务的路由。然而,如果手动配置的话,会产生路由,但是实际使用时路由过去可能会收到一个500错误。
可以用ignored-services从自动映射中排除想排除的服务。设为*就是排除所有。
还可以用prefix来设置URL前缀。忽略的就不演示了。前缀的演示一下。
3.使用静态URL手动映射路由
可以直接这样配置死,绕过Eureka。
也可以在Ribbon中禁用Eureka,配置路由列表,就是一对多。
小笔记:在Ribbon中晋中Eureka意味着Eureka服务器将承受更多的负载。
4.动态重新加载路由配置
访问/refresh端点即可。
5.服务超时
Hystrix默认一秒种是超时时间,可以通过配置配置各个服务的超时时间来进行超时设置,注意超过5s的配置,
三、Zuul的真正威力:过滤器
通过上面的学习可以知道,zuul的基本应用和Nginx差不多,概念也很容易理解,但是Zuul的真正的威力在于其过滤器。
其实理解过滤器,它就像理解Serverlet里的Filter,修饰者模式,不影响原始编码人员。
分为前置,后置和路由,路由过滤器的使用:比如不同版本的服务。
先来一个前置过滤器:
注意对request进行操作的时候,不是用的http默认的request,而是zuul包装的,添加的方法也是zuul包装后的一个函数。
接下来要研究怎么去在服务调用的过程中全程跟踪这个id。
我们要定义三个类:
1.UserContextFilter:拦截传入的http请求
它是一个Http serverlet过滤器。
2.UserContext:使服务易于访问HTTP首部。
这个很简单,定义一个pojo,然后把这个pojo存在ThreadLocal中。
3.自定义RestTemplate和UserContextInteceptor:确保关联ID被传播
小笔记:现在关联ID就可以在全局传播了,这样日志就可以有一个关联主键了。在这里先不讨论日志服务。
四、构建接收关联ID的后置过滤器
验证一下:
五、构建动态路由过滤器
SpecialRoutesFilter代码:
验证:
验证之前,还得新建一个表:
另外检查一下特殊路由服务的配置:
发现它并没有从配置中心拉到配置文件,因为我用的是native本地查找的,所以再给它添加个配置文件就可以了。
然后依次启动Eureka->config->证书,组织,组织新,特殊路由->zuul路由服务。一共七个微服务。(端口设置不一样,Eureka是自动发现的)
等30s,服务注册完毕:
AB测试就可以用了。