Spring Cloud | Note-7

Spring Cloud微服务 | Note(7)

@ 2018年8月9日 15:14:02

API网关

可以管理所有API,用于统一API入口;所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能 ;具有功能:如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理;


API网关的意义

集成多个API;WEB应用API网关,移动应用API网关;避免内部信息泄露;为微服务添加额外的安全层;支持混合通信协议;降低构建微服务的复杂性;微服务模拟与虚拟化;

弊端:

架构上需要额外考虑更多编排与管理;

路由逻辑配置要进行统一的管理;可能引发单点故障;


API网关的实现方式

NGINX:HTTP服务器和反向代理,可用于API网关,简单配置,高性能稳定,低资源消耗;

Zuul:认证,鉴权,限流,路由,监控,弹性,安全,负载均衡,协助单点压测,静态响应等边缘服务的框架;

Kong:API网关的管理平台;专注提供微服务,基于NGINX;多插件;


如何集成Zuul

Zuul:主要作为路由转发和过滤器;

路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务;

zuul默认和Ribbon结合实现了负载均衡的功能;

功能:认证,压力测试,金丝雀测试,动态路由,负载削减,安全,静态响应处理,主动交换管理;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// build.gradle
dependencies {
// Eureka Client
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
// Zuul
compile('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
}
// Application.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulApplication {

public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
// application.properties
spring.application.name=micro-weather-eureka-client-zuul
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
zuul.routes.hi.path=/hi/**
zuul.routes.hi.serviceId=micro-weather-eureka-client

以上配置的意思为:

启动micro-weather-eureka-client时,端口号为:8081;

而启动micro-weather-eureka-client-zuul,端口号为:8080;

访问http://localhost:8080/hello,请求的是client的服务;

而访问http://localhost:8081/hello,请求的是zuul的服务;

而访问http://localhost:8080/hi/hello,请求的是client的服务,由zuul进行了服务请求的转发;

实现API网关

将功能微服务对于数据API与城市数据API的依赖,转化为对Zuul网关的依赖;

1
2
3
4
5
6
7
// application.properties(gateway)
spring.application.name=micro-weather-eureka-client-zuul
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
zuul.routes.city.path=/city/**
zuul.routes.city.serviceId=micro-weather-city-eureka
zuul.routes.data.path=/data/**
zuul.routes.data.serviceId=micro-weather-data-eureka
1
2
3
4
5
6
7
8
// 创建新的DataClient替换原本的CityClient以及WeatherDataServer
@FeignClient("micro-weather-eureka-client-zuul")
public interface DataClient {
@GetMapping("/city/cities")
List<City> listCity() throws Exception;
@GetMapping("/data/weather/cityId/{cityId}")
WeatherResponse getDataByCityId(@PathVariable("cityId")String cityId);
}

附录

@ 2018年8月9日 23:08:56