内容简介:在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了: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 权限校验
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
高可用MySQL
)Charles Bell Mats Kindahl Lars Thalmann / 宁青、唐李洋 诸云萍 / 电子工业出版社 / 2011-10 / 98.00元
《高可用mysql:构建健壮的数据中心》是“mysql high availability”的中文翻译版,主要讲解真实环境下如何使用mysql 的复制、集群和监控特性,揭示mysql 可靠性和高可用性的方方面面。本书由mysql 开发团队亲自执笔,定位于解决mysql 数据库的常见应用瓶颈,在保持mysql 的持续可用性的前提下,挖潜各种提高性能的解决方案。本书分为三个部分。第一部分讲述mysql......一起来看看 《高可用MySQL》 这本书的介绍吧!