SpringCloud微服务网关技术
网关:Api(接口) gateway(网关)----接口网关注意:接口没有界面
网关概念:相当于客户端请求统一先请求到网关服务器上,再由网关服务器进行转发到实际服务器地址上类似于Nginx
- 微服务网关技术产生的背景
- 微服务网关平台 设计思想
- 内网网关:管理内部微服务的网关平台
- 外网网关:管理外部和内部请求的网关
- 微服务网关的作用
- 拦截客户端所有请求,对请求进行权限控制,负载均衡,日志管理,接口调用监控等。
- 网关与过滤器区别
- 过滤器适合单个tomcat服务器进行拦截请求
- 网关是拦截整个微服务所有请求。
- zuul和Nginx的区别
- 相同点:都能实现反向代理,负载均衡,过滤请求,实现网关效果。
- 不同点:
- Nginx采用C语言 zuul用java语言写的。
- zuul负载均衡是采用ribbon+Eureka实现负载均衡
- Nginx是采用服务器端实现负载均衡。
- Nginx比Zuul功能强大,因为Nginx整合一些脚本语言(Nginx+Lua)
- Nginx适合于服务器端负载均衡。
- Zuul适合微服务中实现网关,而且使用技术是java语言。
- 最好建议是Nginx+Zuul实现网关
- Nginx作用实现反向代理
- Zuul对微服务实现网关拦截(黑名单白名单等)
- 搭建SpringCloudZuul网关平台
- 现在搭建一个网关需求就是当客户以app-member/** 请求会转到app-qxd-member这个服务等。
- 网管服务和会员订单服务都是在一个局域网中的。
- 现在第一步导入依赖信息代码如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
上面如果有导入不进去的可以将maven仓库全部删除重新下载,这样就不会有版本冲突等。
- 导入yml文件信息代码如下:
###注册 中心
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8100/eureka/
server:
port: 80
###网关名称
spring:
application:
name: service-zuul
### 配置网关反向代理
zuul:
routes:
api-a:
### 以 /api-member/访问转发到会员服务
path: /api-member/**
serviceId: app-qxd-member
api-b:
### 以 /api-order/访问转发到订单服务
path: /api-order/**
serviceId: app-qxd-order
app-qxd-member是Eureka注册中心上的服务id名称调用。并且zuul整合了ribbon的负载均衡,可以实现访问集群。
接下来接可以创建启动类了,在上面加上@EnableZuulProxy
- Zuul网关拦截参数信息
- 代码如下:
@Component
public class TokenFilter extends ZuulFilter {
public Object run() throws ZuulException {
// 获取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String userToken = request.getParameter("userToken");
if (StringUtils.isEmpty(userToken)) {
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(401);
currentContext.setResponseBody("userToken is null");
return null;
}
// 否则正常执行业务逻辑.....
return null;
}
// 判断过滤器是否生效
public boolean shouldFilter() {
return true;
}
// 过滤器的执行顺序。当请求在一个阶段的时候存在多个多个过滤器时,需要根据该方法的返回值依次执行
public int filterOrder() {
return 0;
}
// 过滤器类型 pre 表示在 请求之前进行拦截
public String filterType() {
return "pre";
}
}
- 搭建动态Zuul网关路由转发(SpringCloud Config 分布式配置中心)
就是在我之前发的SpringCloud Config之上把yum文件中需要动态改变的地方放到git服务器上面,启动ConfigServer就可以了。
比如像登录的时候,很多微服务都调用权限校验会产生冗余的代码,所以可以直接放在网关过滤器。