为什么要使用微服务网关
简单来说,微服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供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
|
|