目录
1 前言
2 Gateway
2.1 Gateway初步使用
2.2 从nacos获取信息
1 前言
网关就是系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身无关公共逻辑可以在这里实现,像认证、鉴权、路由转发等等。
常见网关:
- Nginx+lua
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡和高可用,lua是一种脚本语言,可以编写一些简单的逻辑,nginx支持lua脚本
- Kong
基于nginx+lua开发,性能高,稳定,有多个可用的插件(限流、鉴权)可以开箱即用
问题:只支持http协议,二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。
- Zuul
Netflix开源的网关,功能丰富,使用java开发,易于二次开发
问题:缺乏管控,无法动态配置;依赖组件较多;处理http请求依赖是web容器,性能不如Nginx。
- Spring Cloud Gateway
spring公司为了替换zuul而开发的网关服务。
2 Gateway 2.1 Gateway初步使用Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
优点:
- 性能强劲:是第一代网关Zuul的1.6倍
- 功能强大:内置了很多实用的功能,例如,转发,监控、限流
- 设计优雅,容易扩展
缺点:
- 其实现依赖于Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
- 不能将其部署在Tomcat、Jetty等Servlet容器里、只能打成jar运行
- 需要Spring Boot2.0 以上才能支持
1)新建一个moudle,添加api-gateway
2)引入相关依赖
org.springframework.cloud
spring-cloud-starter-gateway
3)编写配置文件
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
gateway:
routes: #路由数组(当前请求满足什么样的条件转发到哪个微服务上)
- id: product_route #当前路由发的标识、要求唯一
uri: http://localhost:8081 #请求最终要被转发的地址
order: 1 #路由的优先级,数字越小代表路由的优先级越高
predicates: #断言(条件判断,返回值是boolean 转发请求要满足的条件)
- Path=/product-serv/** #当请求路径满足Path的指定路径时,此路由信息才会正常转发
filters: #过滤器(在请求传递过程中,对请求做一些处理)
- StripPrefix=1 #在请求转发之前去掉一层路径
4) 商品微服务controller层
@RestController
@Slf4j
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping("/product/{pid}")
public Product product(@PathVariable("pid") Integer pid) {
log.info("接下来要进行{}号商品的查询",pid);
Product product = productService.findById(pid);
log.info("商品信息查询成功,内容为{}", JSON.toJSONString(product));
return product;
}
}
5)通过网关访问
可见通过网关:http://localhost:7000/product-serv/product/1 == http://localhost:8081/product/1
2.2 从nacos获取信息由2.1 可知:服务网关需要路由的地址是在配置文件中写死固定的,那么这显然在平时开发中是不方便的,所以我们需要将我们的网关服务和nacos结合起来,从nacos中去获取配置。
1)在网关微服务的配置文件下加入nacos的配置
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2)在启动类上加入@EnableDiscoveryClient注解
3)修改配置文件
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #将gateway注册到nacos
gateway:
discovery:
locator:
enabled: true #让gateway从nacos中获取信息
routes: #路由数组(当前请求满足什么样的条件转发到哪个微服务上)
- id: product_route #当前路由发的标识、要求唯一
#uri: http://localhost:8081 #请求最终要被转发的地址
uri: lb://server-product #lb负载均衡 ,后面跟具体微服务在nacos中的标识
order: 1 #路由的优先级,数字越小代表路由的优先级越高
predicates: #断言(条件判断,返回值是boolean 转发请求要满足的条件)
- Path=/product-serv/** #当请求路径满足Path的指定路径时,此路由信息才会正常转发
filters: #过滤器(在请求传递过程中,对请求做一些处理)
- StripPrefix=1 #在请求转发之前去掉一层路径
#localhost:7000/product-serv/product/1--->http://localhost:8081/product/1
4)测试访问
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)