01 注册eureka
02 eureka后台监控加权限
03 feign使用
04 引用common组件
05 hystrix 应用
06 ribbon应用
ribbon是针对微服务之间的负载均衡机制,如果从外部进来的请求需要访问内部服务的时候,就需要zuul来帮助我们了。他可以帮我们做外部访问的负载均衡和过滤的工作。
![1f631d217b87d44469eedd2b1d1a0016.png](https://i-blog.csdnimg.cn/blog_migrate/c17426da4e904ef9bb31744ce7333be6.jpeg)
用户请求zuul的时候会先经过pre过滤器,然后再通过route过滤器,他会通过路由配置把请求导入到对应的微服务,然后再通过post过滤器,最后返回给用户。
建立zuul 服务
先建立一个zuul的项目,一路向导达到目的。
![485f84d3c3f002c156eb8fde4e9e60d8.png](https://i-blog.csdnimg.cn/blog_migrate/7b497c6f7f0b154a0eb9b1672f784b5e.jpeg)
然后就是三板斧。
依赖项,pom.xml 配置
org.springframework.boot spring-boot-starter-parent 1.5.6.RELEASE1.8Dalston.SR4org.springframework.cloud spring-cloud-starter-eurekaorg.springframework.cloud spring-cloud-starter-zuul
配置项,application.yml。即然zuul是一个网关就会拦截外部浏览器对服务的请求,起到了过滤器的作用。制定一个zuul的名字,端口号,以及要注册的服务中心。
spring: application: name: demo-gateway-zuulserver: port: 7600eureka: client: service-url: defaultZone: http://root:123456@localhost:7776/eureka/zuul: routes: demo-eureka-client-consumer: /user/**
这里要注意的是,在zuul.routes的定义中需要把访问服务的名字和路径定义起来。也就是说当访问 demo-eureka-client-consumer 的/user/ 路径的时候就可以被服务感知。
启动项
在启动的class上面打上annotation,告诉程序这个作为zuul的gateway。
![c8ba951593e0722c2b09831ed1e27c93.png](https://i-blog.csdnimg.cn/blog_migrate/386271d3e83b7e99cbc8d21e1ad14ebf.jpeg)
测试结果
测试之前再回顾一下,我们之前的服务器端口号。
eureka server 7776
provider 8081
provider2 8083
consumer 8082
zuul 7600
现在我们要通过访问zuul的7600 端口,然后由zuul帮我们路由到 consumer 8082 上面去。
![f63c1400fcb19aa0cdc4dbe8e390151f.png](https://i-blog.csdnimg.cn/blog_migrate/81f618e01c961b215cbfc25d52ddcb10.jpeg)
这里我们通过zuul的7600 服务,路由从原来的userlogin 更改成了 /user/userlogin zuul帮我们路由到了 consumer的 /userlogin 上面去了。
回头看看 zuul也注册到中心了。
![ace99c20995965fd0d41316eb6b8ed2c.png](https://i-blog.csdnimg.cn/blog_migrate/45639d27eaa8652492c71c97573d52b6.jpeg)
过滤器filter 测试
这里建立一个filter的class,继承于ZuulFilter
![017005a2cc1976b62506b5316b5bc53a.png](https://i-blog.csdnimg.cn/blog_migrate/e212b0b55f823f295d106ce5d6c3f5af.jpeg)
主要是选择过滤器的类型,优先级,是否生效,过滤器运行的内容,如下。
@Componentpublic class PreFilter extends ZuulFilter{ @Override public String filterType() {//过滤器类型 return FilterConstants.PRE_TYPE; } @Override public int filterOrder() {//同类型过滤器优先级,数字越小优先级越高 return 0; } @Override public boolean shouldFilter() {//过滤器是否生效 return true; } @Override public Object run() {//出发过滤条件时运行的内容 RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); String token = request.getHeader("token"); if (token == null || token.equals("")){ context.setSendZuulResponse(false); context.setResponseStatusCode(401); context.setResponseBody("{"message":"no permission, need to login!"}"); return "access denied"; } return "access succeed"; }}
然后再运行zuul,并且通过zuul访问consumer 服务。
访问的时候如果token为空那么,访问失败并且提示信息如下。
![4e0ffe2c1f2e3000903bae6855e1a809.png](https://i-blog.csdnimg.cn/blog_migrate/5daddf2ba22cfbffded02675f18cff97.jpeg)
然后,我们在token中随便填写一些内容。
![e279d1eae820deb26e9a3206996e2baa.png](https://i-blog.csdnimg.cn/blog_migrate/58205245324ebdf5b1cf541962d76c78.jpeg)
得到正确的结果。
搞定收工。
如果喜欢点个关注,转发一下。
谢谢各位。