内容简介:在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了:1 添加依赖2 添加yml
网关在微服务里的角色
在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了:
- 统一授权
- 统一异常处理
- 路由导向
- 跨域处理
- 限流
实践一下
1 添加依赖
dependencies { implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') implementation('org.springframework.cloud:spring-cloud-starter-netflix-zuul') testImplementation('org.springframework.boot:spring-boot-starter-test') implementation('com.marcosbarbero.cloud:spring-cloud-zuul-ratelimit:1.3.2.RELEASE') }
2 添加yml
server: port: 8300 spring: application: name: microservice-gateway-zuul eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:6761/eureka instance: ip-address: true zuul: routes: users: path: /lind/** #以lind开头的路径被重定向到lind服务 serviceId: lind add-host-header: true #显示真实的http头 retryable: false #关闭Hystrix的重试功能 ratelimit: enabled: true # repository: REDIS behind-proxy: true policies: users: limit: 5 #限流,每分钟请求5次 refresh-interval: 60 type: - user - origin - url # url类型的限流就是通过请求路径区分 # origin是通过客户端IP地址区分 # user是通过授权用户进行区分,也包括匿名用户
3 添加实现代码
http拦截器,获取用户ID,为子服务进行传递
public class PreRequestLogFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(PreRequestLogFilter.class); private final RateLimiter rateLimiter = RateLimiter.create(1000.0); @Override public Object run() { try { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletResponse response = currentContext.getResponse(); HttpServletRequest reqeust = currentContext.getRequest(); currentContext.addZuulRequestHeader("userId","123");//向子系统http头写数据 currentContext.addZuulRequestHeader("userName","test"); PreRequestLogFilter.logger.info( String.format("send %s request to %s", reqeust.getMethod(), reqeust.getRequestURL().toString())); if (!rateLimiter.tryAcquire()) { HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS; response.setContentType(MediaType.TEXT_PLAIN_VALUE); response.setStatus(httpStatus.value()); response.getWriter().append(httpStatus.getReasonPhrase()); currentContext.setSendZuulResponse(false); throw new ZuulException( httpStatus.getReasonPhrase(), httpStatus.value(), httpStatus.getReasonPhrase() ); } } catch (java.lang.Exception e) { ReflectionUtils.rethrowRuntimeException(e); } return null; } @Override public boolean shouldFilter() { // 判断是否需要过滤 return true; } @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return Ordered.HIGHEST_PRECEDENCE; } }
在主程中注入这个过滤器
@Bean public PreRequestLogFilter preRequestLogFilter() { return new PreRequestLogFilter(); }
4 使用它
在URL上通过localhost:8300/users/home 将进行lind服务里的home控制器下,并在http头上写入了userid和username这个键值对!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- zuul网关实现解析
- 微服务网关-Kong开源实现(7.30)
- 微服务和API网关-实现(11.30)
- OFGP:开源网关协议实现跨链价值流通
- 百亿规模 API 网关服务 Shepherd 的设计与实现
- 服务网关 Zuul 与 Redis 结合实现 Token 权限校验
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming Ruby
Dave Thomas、Chad Fowler、Andy Hunt / Pragmatic Bookshelf / 2004-10-8 / USD 44.95
Ruby is an increasingly popular, fully object-oriented dynamic programming language, hailed by many practitioners as the finest and most useful language available today. When Ruby first burst onto the......一起来看看 《Programming Ruby》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
UNIX 时间戳转换
UNIX 时间戳转换