使用 Spring Cloud 构建微服务之Gateway
2019/4/16
系统已经微服务化了,并且使用 Eureka 来做了服务的发现与治理。那么接下去的问题就是如何把服务暴露给外部终端使用了。
把所有的 Api Endpoint 都暴露出去吗?如何做请求验证呢? 如果把所有的 Api Endpoint 都暴露出去,在每个 Api Endpoint 都做一次 AccessToken 验证码?并且终端请求 Api 的粒度和微服务提供的粒度是不一致的。比如:请求一个用户的 Profile 数据, 终端需要的可能是个人信息,账户信息,近期订单信息等。 而在三个信息分别有三个微服务提供,让客户端请求三次吗?
Api Gateway
实现一个 Api Gateway 作为一个统一的入口,并且能够把请求转发到背后相应的微服务端。
用 Zuul 实现 Api Gateway
用 zuul 能非常快速的实现一个 Api Gateway,同时能和 Eureka 很好的集成。
建立一个 Spring Boot Application,添加 Eureka Client 和 Zuul 相关的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
在 Application 上开启 EnableDiscoveryClient 和 ZuulProxy
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
@RestController
public class GatewayApplication {
@Autowired
private DiscoveryClient discoveryClient;
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@GetMapping("/")
public String home() {
List<ServiceInstance> list = discoveryClient.getInstances("SERVICE-PROVIDER");
if(list != null && list.size() > 0 )
{
return list.get(0).getUri().toString() + ": new 2";
}
return "cannot found consultants";
}
}
在代码里,我们用 discoveryClient
从 Eureka Server 那里查询是否有注册为 service-provider
的微服务。
打开首页:
这里现实的信息和 Eureka Server 上注册的信息一致,
说能从 Eureka Server 发现微服务信息成功。 并且 Zuul 会默认把发现的微服务,通过 zuul 暴露给外部调用:
这里我们通过访问 gateway application 的 service-provider
, zuul 会把这个请求转发给
service-provider 服务,并且返回结果,
跟直接访问,两者一样。
到这里,一个简单的微服务应用就跑起来了, 哈利路亚
Github demo 地址: gateway