为什么要使用微服务网关 简单来说,微服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。 API网关是什么 API网关可以提供一个单独且统一的API入口用于访问内部一个或多个API。简单来说嘛就是一个统一入口,比如现在的支付宝或者微信的相关api服务一样,都有一个统一的api地址,统一的请求参数,统一的鉴权。 客户端和服务端直连的弊端 • 客户端会对此请求不同的微服务,增加客户端复杂性 • 存在跨域请求时,需要进行额外处理 • 认证服务,每个服务需要独立认证 • UI端和微服务耦合 网关的优缺点 优点: • 减少api请求次数 • 限流 • 缓存 • 统一认证 • 降低微服务的复杂度 • 支持混合通信协议(前端只和api通信,其他的由网关调用) • …… 缺点: • 网关需高可用,可能产生单点故障 • 管理复杂 Zuul实践 创建工程:spring-cloud-zuul。 这里直接加入了注册中心进行服务化模式。 0.加入pom依赖。 <!-- zuul 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- eureka client 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> 注意:这里的Eureka不是必须的。在没有注册中心的情况下,也是可以进行zuul使用的。 1.配置文件,配置注册中心相关信息、路由规则等。 spring.application.name=zuul-server server.port=8888 # 注册中心地址 -此为单机模式 eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka # 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的 eureka.instance.prefer-ip-address=true # 实例名称 最后呈现地址:ip:15678 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} ## 路由规则 ## 传统路由配置:不依赖服务发现。 ## 所有以myapi开头的url路由至http://127.0.0.1:2000/下 ## 如http://127.0.0.1:8888/myapi/hello --> http://127.0.0.1:2000/hello zuul.routes.myApi.path=/myapi/** zuul.routes.myApi.url=http://127.0.0.1:2000 #forward模式 直接转发至zuul提供的rest服务 zuul.routes.myDemo.path=/myDemo/** zuul.routes.myDemo.url=forward:/demo ## 服务发现模式 # 路由地址 zuul.routes.myEureka.path=/eureka/** #为具体服务的名称 zuul.routes.myEureka.service-id=eureka-client 友情提示: 默认情况下:Zuul代理所有注册到EurekaServer的微服务,路由规则: http://ZUUL_HOST:ZUUL_PORT/微服务实例名(serverId)/** 转发至serviceId对应的微服务。 如:http://127.0.0.1:8888/eureka-client/hello?name=oKong 最后就是转发至:http://127.0.0.1:2000//hello?name=oKong 2.启动类加入@EnableZuulProxy注解,声明一个Zuul代理。 /** * zuul 示例 * * @author oKong * */ @SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient @Slf4j public class SpringCloudZuulApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudZuulApplication.class, args); log.info("spring-cloud-zuul启动!"); } } 3.编写一个控制类,测试forward功能。 /** * zuul 内部提供对外服务示例 * @author oKong * */ @RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/hello") public String hello(String name) { return "hi," + name + ",this is zuul api! "; } } 4.启动spring-cloud-eureka-server和spring-cloud-eureka-client服务,之后再启动spring-cloud-zuul服务。 此时,我们来访问zuul内部服务:http://127.0.0.1:8888/demo/hello?name=oKong