经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
springboot~zuul实现网关
来源:cnblogs  作者:张占岭  时间:2018/10/19 9:23:51  对本文有异议

网关在微服务里的角色

在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了:

  1. 统一授权
  2. 统一异常处理
  3. 路由导向
  4. 跨域处理
  5. 限流

实践一下

1 添加依赖

  1. dependencies {
  2. implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
  3. implementation('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
  4. testImplementation('org.springframework.boot:spring-boot-starter-test')
  5. implementation('com.marcosbarbero.cloud:spring-cloud-zuul-ratelimit:1.3.2.RELEASE')
  6. }

2 添加yml

  1. server:
  2. port: 8300
  3. spring:
  4. application:
  5. name: microservice-gateway-zuul
  6. eureka:
  7. client:
  8. register-with-eureka: true
  9. fetch-registry: true
  10. service-url:
  11. defaultZone: http://localhost:6761/eureka
  12. instance:
  13. ip-address: true
  14. zuul:
  15. routes:
  16. users:
  17. path: /lind/** #以lind开头的路径被重定向到lind服务
  18. serviceId: lind
  19. add-host-header: true #显示真实的http头
  20. retryable: false #关闭Hystrix的重试功能
  21. ratelimit:
  22. enabled: true
  23. # repository: REDIS
  24. behind-proxy: true
  25. policies:
  26. users:
  27. limit: 5 #限流,每分钟请求5次
  28. refresh-interval: 60
  29. type:
  30. - user
  31. - origin
  32. - url
  33. # url类型的限流就是通过请求路径区分
  34. # origin是通过客户端IP地址区分
  35. # user是通过授权用户进行区分,也包括匿名用户

3 添加实现代码
http拦截器,获取用户ID,为子服务进行传递

  1. public class PreRequestLogFilter extends ZuulFilter {
  2. private static final Logger logger = LoggerFactory.getLogger(PreRequestLogFilter.class);
  3. private final RateLimiter rateLimiter = RateLimiter.create(1000.0);
  4. @Override
  5. public Object run() {
  6. try {
  7. RequestContext currentContext = RequestContext.getCurrentContext();
  8. HttpServletResponse response = currentContext.getResponse();
  9. HttpServletRequest reqeust = currentContext.getRequest();
  10. currentContext.addZuulRequestHeader("userId","123");//向子系统http头写数据
  11. currentContext.addZuulRequestHeader("userName","test");
  12. PreRequestLogFilter.logger.info(
  13. String.format("send %s request to %s",
  14. reqeust.getMethod(),
  15. reqeust.getRequestURL().toString()));
  16. if (!rateLimiter.tryAcquire()) {
  17. HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;
  18. response.setContentType(MediaType.TEXT_PLAIN_VALUE);
  19. response.setStatus(httpStatus.value());
  20. response.getWriter().append(httpStatus.getReasonPhrase());
  21. currentContext.setSendZuulResponse(false);
  22. throw new ZuulException(
  23. httpStatus.getReasonPhrase(),
  24. httpStatus.value(),
  25. httpStatus.getReasonPhrase()
  26. );
  27. }
  28. } catch (java.lang.Exception e) {
  29. ReflectionUtils.rethrowRuntimeException(e);
  30. }
  31. return null;
  32. }
  33. @Override
  34. public boolean shouldFilter() {
  35. // 判断是否需要过滤
  36. return true;
  37. }
  38. @Override
  39. public String filterType() {
  40. return FilterConstants.PRE_TYPE;
  41. }
  42. @Override
  43. public int filterOrder() {
  44. return Ordered.HIGHEST_PRECEDENCE;
  45. }
  46. }

在主程中注入这个过滤器

  1. @Bean
  2. public PreRequestLogFilter preRequestLogFilter() {
  3. return new PreRequestLogFilter();
  4. }

4 使用它
在URL上通过localhost:8300/users/home 将进行lind服务里的home控制器下,并在http头上写入了userid和username这个键值对!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号