衷于栖
  • 衷于栖
  • 首页
  • 归档
  • 关于

Image
Profile Picture

衷于栖

自由开发者

分类目录

三维技术4 介绍2 应用1 异常1 技术笔记17 游戏2 源码解读3 管理5 读书笔记3 车联网3 转载11 随笔3

热门标签

  • GIT
  • 工作流指南
  • docker
  • SCRUM
  • JT808
  • 百度地图
  • 狼人杀
  • 模型数据结构
  • 敏捷
  • 扩展
  • 学习WEBGL系列
  • 可维护
  • GlTF
  • CentOS
  • 高德地图
  • 集中式
  • 郭麒麟
  • 郭德纲
  • 进阶
  • 路由节点编辑器

微信订阅

Image

友情链接

王海达博客 Steve Yegge Debug 客栈 Codelei's Blog 笛卡尔积 Java九点半课堂 薛定喵君

【Spring】SpringCloud不完整总结

2020-04-20     技术笔记


本文不完整介绍 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
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

以及配置

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有端点

Eureka

服务注册中心,分为服务端和客户端两部分,服务端用于部署服务,使用 @EnableEurekaServer 注解启动,下面是依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

客户端用于注册服务,使用 @EnableDiscoveryClient 注解启动,下面是依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

注册中心参考配置

更复杂的配置可以看官方文档,支持 region 和 zones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 8080

eureka:
instance:
hostname: localhost
preferIpAddress: true
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
peer-eureka-nodes-update-interval-ms: 10000 # 默认是10分钟即600000,这里为了验证改为10秒
waitTimeInMsWhenSyncEmpty: 0
enableSelfPreservation: false # 保护注册信息,独立运行时可以关闭

服务实例信息一致性

CAP理论:

  • Consistency: 数据一致性
  • Availability: 可用性
  • Partition Tolerance: 分区容忍性

Eureka 是 AP 的,认为保留过期数据比丢失可用数据好。这种情况下就需要客户端支持负载均衡(Ribbon)和熔断(Hystrix),避免服务无响应。很多情况下,负载均衡会在Feign、Gateway中被隐含使用,并不需要显示的配置依赖。

Config

服务配置中心,有服务端和客户端两部分,服务端使用 @EnableConfigServer 注解配置,并添加maven依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

因为顺序的原因,客户端启动配置需要在 bootstrap.yml 中写:

1
2
3
4
5
6
7
spring:
cloud:
config:
label: master
uri: http://localhost:9090 # 如果使用了 注册中心 不需要配置这一条 当然注册中心也需要在这里配置
name: server-config
profile: dev

客户端maven依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>

配置服务端支持数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8888
spring:
application:
name: server-config
profiles:
active: jdbc # 这里使用jdbc 减少操作
datasource:
url: jdbc:hsqldb:hsql://localhost/config
username: sa
password:
driver-class-name: org.hsqldb.jdbc.JDBCDriver
cloud:
config:
server:
jdbc:
sql: select key,value from CONFIG_PROPERTIES where application=? and profile=? and label=?

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
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

Ribbon负载均衡策略

  • RandomRule
  • RoundRobinRule
  • RetryRule
  • BestAvaliableRule
  • AvailablilityFilteringRule
  • ResponseTimeWeightedRule
  • ZoneAvoidanceRule

断路器和熔断区别

断路器是主动中断,熔断是被动中断。

Consul

Eureka 的替代方案,仅需要配置一下就可以简单使用,更多配置请查看官方文档。

1
2
3
4
5
spring:
cloud:
consul:
host: localhost
port: 8500

其他

  • Skywalking 非侵入式的全链路跟踪,在最小化系统中并不是必须的,暂时就忽略了,但实际应用场景中全链路追踪,我更倾向于使用Skywalking。
  • gRPC 可选择 HTTP2 替代。
  • SpringCloudAlibaba 持续关注,如果使用阿里系应用服务,我觉得这个还是有必要用的,其他情况按需。

最后

当然微服务开发远不止最小化解决方案,但这完全可以是一个开端。不仅仅开发,自动化运维甚至机器学习,将来也是有必要的。学无止境,经验越多,越觉得自己无知,伴随着“无知”带来的危机感才是最可怕的。送君一句:衷于栖,即是吾名,亦是吾志,共勉之。

#Spring Cloud

Copyright © 2021 zhoyq.com. All rights reserved.

京ICP备 17068495号-1