本文不完整介绍 SpringCloud
最小化可用解决方案。
概述
从 Spring
官网来看 Cloud
,最小化的微服务配置应该有:
- 服务注册中心
- 服务配置中心
- 服务网关
- 授权服务
- 对应服务的管理服务(服务管理、配置管理、授权管理、网关管理)
隐含的技术
- 动态路由
- 负载均衡
- 熔断
- 断路
- 灰度发布
- 权重
- 限流
- 降级
- 隔离
- 监控
- 追踪
- Oauth2
- JWT
- 缓存
深入一些,了解更多的替代方案
- 服务注册中心方案(Eureka、Consul、ZooKeeper)
- 配置中心(本地存储、基于GIT仓库、基于关系数据库)
- 服务网关(基于配置中心、基于关系数据库)
- 授权服务(Security、Oauth2\DB Token、Oauth2\Java Web Token)
- 监控(链路监控、服务监控)(Skywalking全链路监控、使用logback记录信息、当然也可以使用header记录traceId、Hystrix、Turbine)
- 缓存机制((caffe(本地)、redis、mongodb))
- 当然还有 SpringCloud Alibaba 提供的整体解决方案
- 管理服务不是本文重点但是确实实践重点
最具代表性的最小化方案
- Eureka
- Config + HSQLDB
- Gateway + HSQLDB(动态路由配置)
- Oauth2 + JWT + HSQLDB
为什么用
HSQLDB
?
可以在内存创建一个数据库,独立使用而且速度很好,语法健全,我一般本地测试都用这个。仅代表关系型数据库的典型。
我相信最好的学习方式就是从单元开始,单元就是不可再分的最小方案,透过最小方案的实现,在需要时定制需要的内容才是这类应用正确的打开方式。
Actuator
从监控开始,一个软件最重要的部分就是监控。所以不管是哪个应用在开发期间我都会增加这个依赖,目的就是暴露监控端点使程序状态可控。Actuator
可用端点可以从这里查看,下面是 maven
依赖:
1 | <dependency> |
以及配置
1 | management: |
Eureka
服务注册中心,分为服务端和客户端两部分,服务端用于部署服务,使用 @EnableEurekaServer
注解启动,下面是依赖:
1 | <dependency> |
客户端用于注册服务,使用 @EnableDiscoveryClient
注解启动,下面是依赖:
1 | <dependency> |
注册中心参考配置
更复杂的配置可以看官方文档,支持 region
和 zones
1 | server: |
服务实例信息一致性
CAP理论:
- Consistency: 数据一致性
- Availability: 可用性
- Partition Tolerance: 分区容忍性
Eureka
是 AP 的,认为保留过期数据比丢失可用数据好。这种情况下就需要客户端支持负载均衡(Ribbon)和熔断(Hystrix),避免服务无响应。很多情况下,负载均衡会在Feign、Gateway中被隐含使用,并不需要显示的配置依赖。
Config
服务配置中心,有服务端和客户端两部分,服务端使用 @EnableConfigServer
注解配置,并添加maven依赖:
1 | <dependency> |
因为顺序的原因,客户端启动配置需要在 bootstrap.yml
中写:
1 | spring: |
客户端maven依赖
1 | <dependency> |
配置服务端支持数据库
1 | server: |
Gateway
网关服务,想要使用关系数据库存储路由配置,实现 RouteDefinitionRepository
接口即可。动态路由管理的API,在Actuator中已经有相映的端点实现。
网关服务的配置不多,但是有一个趁手的工具进行配置还是很必要的,我基于网关端点服务开发了一个节点编辑器,用于配置路由,需要的自取。
- 链接:
https://pan.baidu.com/s/1QDoVxq8Mgr56GdoIHKB4dA
- 提取码:
ygku
Oauth2
权限控制中讲Oauth2的其实很多,我个人也比较倾向于使用Oauth2,Oauth2其他都好说,单说说别人那没有说明白的,就是这个权限本身,在Oauth2的定义中,本来对权限也没有非常严格的划分,所以这个时候就是仁者见仁智者见智了。
客户端权限管理中最重要的关键词
- ResourceId 指代服务资源
- Scope 指代用户资源访问权限
- Authoritiy 指代权限
嫁接权限体系,我使用的是比较常用的系统中的权限体系(用户、安全组/角色、权限)
- 用户:权限来自绑定客户端
- 安全组/角色:对应存储位置 Authoritiy
- 权限:对应存储位置 Authoritiy
- 客户端:来自Oauth2中的定义,存储着与三个权限关键字之间的关系。
备忘
Feign
服务间通信,用于取代直接使用URLConnection、HttpClient、Netty、RestTemplate等直接访问接口。Feign可以使用Spring注解、负载均衡、熔断机制等,使用更加方便。最重要的时它能通过简单的配置自由选择底层的实现。相关配置可以看官方文档,下面是它的 maven 依赖:
1 | <dependency> |
Ribbon负载均衡策略
- RandomRule
- RoundRobinRule
- RetryRule
- BestAvaliableRule
- AvailablilityFilteringRule
- ResponseTimeWeightedRule
- ZoneAvoidanceRule
断路器和熔断区别
断路器是主动中断,熔断是被动中断。
Consul
Eureka 的替代方案,仅需要配置一下就可以简单使用,更多配置请查看官方文档。
1 | spring: |
其他
- Skywalking 非侵入式的全链路跟踪,在最小化系统中并不是必须的,暂时就忽略了,但实际应用场景中全链路追踪,我更倾向于使用Skywalking。
- gRPC 可选择 HTTP2 替代。
- SpringCloudAlibaba 持续关注,如果使用阿里系应用服务,我觉得这个还是有必要用的,其他情况按需。
最后
当然微服务开发远不止最小化解决方案,但这完全可以是一个开端。不仅仅开发,自动化运维甚至机器学习,将来也是有必要的。学无止境,经验越多,越觉得自己无知,伴随着“无知”带来的危机感才是最可怕的。送君一句:衷于栖,即是吾名,亦是吾志,共勉之。