Spring Cloud 分布式微服务实践

Spring Cloud 微服务框架

Spring Cloud 是基于 Netflix 等公司大量的微服务实践,封装出的一整套微服务开发框架,主要包括微服务网关、服务注册中心、配置中心、远程调用、负载均衡、消息总线、容错断路、监控追踪等模块,为开发高可用、高可扩展性的分布式应用提供了一套易用的解决方案。

Spring Cloud 的微服务组件基于 Spring Boot 开发,可以说 Spring Boot 是 Spring Cloud 的基石。

Spring Boot 通过自动配置等功能极大地简化了 Spring 应用的开发,提升了开发效率,同时支持内嵌 Tomcat(以及 Jetty、Undertow)等 Servlet 容器,打包部署更加方便。

前不久刚刚发布了 SpringBoot 2.0 版本,该版本最大特点是将响应式编程作为首选的编程范式,支持 WebFlux、RxJava,更易于实现异步和事件驱动,创建完全非阻塞式应用。

分布式微服务实践

这里我们基于 Spring Cloud 开发一个分布式应用,主要用到 Eureka 服务注册发现、Config 配置中心、Feign 做服务调用、Zuul 微服务网关、Hystrix 服务容错降级、Admin 服务管控、Zipkin 服务链路追踪,具体包括以下几个微服务:

注册中心 eureka-server

启动应用后,打开 http://localhost:8761 可以看到启动的服务实例

配置中心 config-server

该服务将 git 仓库中的配置文件以接口形式提供,客户端可以获取并加载配置。

例如获取 eureka 配置信息,打开 http://localhost:3600/eureka/default

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"name": "eureka",
"profiles": [
"default"
],
"label": null,
"version": "a716ea609caaa0811387bcc616227b42e6094b26",
"state": null,
"propertySources": [
{
"name": "https://github.com/yunTerry/spring-cloud-netflix/config-repo/eureka.yml",
"source": {
"spring.application.name": "eureka-server",
"server.port": 8761,
"eureka.client.register-with-eureka": false,
"eureka.client.fetch-registry": false,
"management.security.enabled": false
}
}
]
}

微服务网关 Zuul

用 serviceId 代替 URL,实现动态路由。

通过 Zuul 过滤器进行请求鉴权,拦截不合法请求

还可以在 Zuul 中实现 API 限流等操作,参考 Spring Cloud Zuul 微服务网关的 API 限流

服务生产者 token-service

Token 认证相关服务,提供生成 token 和验证 token 的接口

1
2
3
4
5
@GetMapping("/token/generate/{uid}")
String getToken(@PathVariable String uid);

@GetMapping("/token/verify")
boolean verify(@RequestParam String token);

服务消费者 user-service

调用用户相关服务的时候,会消费 token 认证服务,使用 Feign 调用服务,通过 Hystrix 提供容错保护

http://localhost:4000/user-service/login 发 POST 请求

登录或注册成功返回 token

1
2
3
4
5
{
"code": 0,
"msg": "login success",
"data": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3NjVhNWEyYy1hYzhhLTQxNDctYjI2Yy0zNTFlYTA0NjI4OGEiLCJleHAiOjE1MjA1OTMzODF9.NMUjrRk7MsAROuq1OLOUM9WOefgkZmg5_M_mjiSVa0Cz-SunY2ucgxEvOGdKW7U1AVteNVVtD1v_cQlwA_wREQ"
}

把 token 放在请求头,获取用户信息 http://localhost:4000/user-service/user/info

1
2
3
4
5
6
7
8
9
10
11
{
"code": 0,
"msg": "success",
"data": {
"id": "765a5a2c-ac8a-4147-b26c-351ea046288a",
"name": "aa",
"sex": "boy",
"img": "http://img.com/aa32.jpg",
"age": 20
}
}

服务管控 admin-server

打开 http://localhost:5033

进入服务管理界面,查看服务运行状态

服务链路追踪 Zipkin

http://localhost:5500/zipkin/ 可以查看服务调用链路

服务调用时间

调用详情

项目源码

https://github.com/yunTerry/spring-cloud-netflix