做CSE的开发有一段时间了,前段时间太忙,现在终于有空总结了一些在CSE开发方面的经验,大伙看看是不是有用?
- 项目管理
-
Maven依赖管理
推荐: 业务使用Maven的dependencyManagement来管理服务的依赖关系,这样能够有效的管理三方件冲突。推荐的做法:
1) 业务创建一个pom dependencyManagement
2) 在项目的pom中,优先引用业务自身的dependencyManagement,再引用CSE的dependencyManagement,如下:
-
Xml 代码
01 |
<dependencyManagement> |
|
02 |
<dependencies> |
03 |
<dependency> |
|
04 |
<groupId>com.test</groupId> |
05 |
<artifactId>test-dependencies</artifactId> |
|
06 |
<version>1.0.0-SNAPSHOT</version> |
07 |
<type>pom</type> |
|
08 |
<scope>import</scope> |
09 |
</dependency> |
|
10 |
<dependency> |
11 |
<groupId>com.huawei.paas.cse</groupId> |
|
12 |
<artifactId>cse-dependency</artifactId> |
13 |
<version>${cse.version}</version> |
|
14 |
<type>pom</type> |
15 |
<scope>import</scope> |
|
16 |
</dependency> |
17 |
</dependencies> |
|
18 |
</dependencyManagement> |
2. 传统项目切换
有些存量老项目是使用Ant构建的,所有的依赖包都是直接引入项目,不能自动的解决冲突,所以如果能切换成maven的建议优先切换成maven
3. 传统项目直接引用CSE
需要按需引入对CSE的依赖,再使用maven工具导出所有依赖的jar包,使用文件对比工具找出和以前版本有冲突的版本,人工去除冲突。
1)首先确认是使用那种开发模式和传输方式,比如使用SpringMVC+Rest over Vertx模式,是否使用到CSE提供的一些其它扩展功能。
2)新建一个maven工程,建议到华为云https://console.huaweicloud.com/cse/?region=cn-south-1#/cse/projectLocal下载一个demo工程,里面包含一个CSE推荐的依赖。如果想按需加载,需要自己根据实际功能来进行选择。功能列表如下:
3) 使用maven-dependency-plugin导出所有的依赖包
-
Xml 代码
01 |
<build> |
|
02 |
<plugins> |
03 |
<plugin> |
|
04 |
<groupId>org.apache.maven.plugins</groupId> |
05 |
<artifactId>maven-dependency-plugin</artifactId> |
|
06 |
<executions> |
07 |
<execution> |
|
08 |
<id>copy-dependencies</id> |
09 |
<phase>package</phase> |
|
10 |
<goals> |
11 |
<goal>copy-dependencies</goal> |
|
12 |
</goals> |
13 |
<configuration> |
|
14 |
<outputDirectory>target/lib</outputDirectory> |
15 |
</configuration> |
|
16 |
</execution> |
17 |
</executions> |
|
18 |
</plugin> |
19 |
</plugins> |
|
20 |
</build> |
4) 人工解决冲突,这个没有什么太好方法,挨个比对下。
- 开发方式
CSE提供开发模式和传输解耦的设计,开发模式提供JaxRS、SpringMVC和透明RPC三种形式,传输方式提供Highway、Rest over Servlet和Rest over Vertx三种方式,但是在一个团队内建议大家使用相同的开发模式和传输方式,当前在消费者云云服务主要使用的组合是SpringMVC+Rest over Vertx和SpringMVC+Rest over Servlet。
- 微服务依赖关系
微服务之间不能循环依赖。
- 推荐配置
只是一个推荐配置,具体业务需要根据需要进行调整,特别是治理相关的高级配置。
-
Xml 代码
001 |
APPLICATION_ID: blog |
002 |
service_description: |
003 |
name: comment-service |
|
004 |
version: 2.0.11 |
005 |
properties: |
|
006 |
allowCrossApp: false |
007 |
instance_description: |
|
008 |
environment: production #production, development,在开发的时候配置成开发模式,修改契约可以不变更版本 |
009 |
cse: |
|
010 |
service: |
011 |
registry: |
|
012 |
address: http://10.21.208.113:30100 |
013 |
instance: |
|
014 |
healthCheck: |
015 |
interval: 30 # 健康检查间隔时间,默认30秒,可选 |
|
016 |
times: 3 # 健康检查检测次数,默认3次,可选 |
017 |
watch: true # watch机制可以快速感知实例变化 |
|
018 |
diagnose: |
019 |
interval: 12 |
|
020 |
config: |
021 |
client: |
|
022 |
serverUri: http://10.21.208.113:30103 |
023 |
refreshMode: 1 |
|
024 |
refresh_interval: 5000 |
025 |
first_refresh_interval: 5000 |
|
026 |
monitor: |
027 |
client: |
|
028 |
serverUri: http://10.21.208.113:30109 |
029 |
sslEnalbed: false #如果开启https,请设置为true |
|
030 |
enable: true # 是否开启,如果不需要对接,请设置成false |
031 |
rest: |
|
032 |
address: 0.0.0.0:18082?sslEnabled=false&protocol=http2 |
033 |
client: |
|
034 |
thread-count: 8 |
035 |
connection: |
|
036 |
maxPoolSize: 10 |
037 |
idleTimeoutInSeconds: 30 #单位秒 |
|
038 |
keepAlive: true |
039 |
server: |
|
040 |
thread-count: 8 |
041 |
compression: false #支持服务端压缩 |
|
042 |
maxHeaderSize: 8192 #单位byte |
043 |
timeout: 3000 #单位毫秒 |
|
044 |
connection: |
045 |
idleTimeoutInSeconds: 60 # 服务端连接超时时间,一个连接在指定时间内没有接收到请求 |
|
046 |
uploads: |
047 |
directory: /home/upload # 文件上传 |
|
048 |
maxSize: 1024 #上传文件body大小 |
049 |
maxFileSize: 3 #文件个数限制 |
050 |
fileSizeThreshold: 0 #磁盘大小阈值 |
051 |
request: |
|
052 |
timeout: 1000 #请求超时时间 |
053 |
metrics: |
|
054 |
enabled: true |
055 |
handler: |
056 |
chain: |
057 |
Provider: |
|
058 |
default: qps-flowcontrol-provider,bizkeeper-provider |
059 |
Consumer: |
|
060 |
default: qps-flowcontrol-consumer,loadbalance,bizkeeper-consumer |
061 |
# 数据中心,用于服务做亲缘性选择,优先调用本az服务 |
|
062 |
datacenter: |
063 |
name: myDC #数据中心名称, |
|
064 |
region: my-Region #数据中心区域,比如华南soutchchina、华北northchina |
065 |
availableZone: my-Zone #数据中心可用取sz |
|
066 |
isolation: |
067 |
Consumer: |
|
068 |
maxConcurrentRequests: 20 |
069 |
#限流相关配置 |
|
070 |
flowcontrol: |
071 |
Provider: #服务端限流 |
|
072 |
qps: |
073 |
global: |
|
074 |
limit: 1000 #全局限流,默认是最大值 |
075 |
limit: |
|
076 |
service1: 500 #对单个consuer服务进行限流,默认无,如果有要求需要添加 |
077 |
Consumer: |
|
078 |
qps: |
079 |
limit: |
|
080 |
serivce2: #对服务级别限流500 |
081 |
schema1: #对服务的schema级别进行限流500 |
|
082 |
operation1: 100 #对服务的schema的操作级别进行限流 |
083 |
#服务容错 |
|
084 |
fallback: #容错策略支持全局、微服务和方法级别 |
085 |
Consumer: |
|
086 |
springmvc: |
087 |
codeFirst: |
|
088 |
fallbackForce: |
089 |
enable: true #是否开启隔离机制,默认为false |
|
090 |
force: true #是否强制开启容错机器 |
091 |
maxConcurrentRequests: 10 #隔离时最大的并发数,默认为10,客户端调用时 |
|
092 |
|
093 |
fallbackpolicy: #容错策略,默认提供returnNull throwException fromCache三种策略,用户可以自己实现io.servicecomb.bizkeeper.FallbackPolicy接口, policy支持全局、微服务和方法级别 |
|
094 |
Consumer: |
095 |
springmvc: |
|
096 |
codeFirst: |
097 |
fallbackFromCache: |
|
098 |
policy: fromCache # 从缓存中获取上一次成功的数据, |
099 |
fallbackReturnNull: |
|
100 |
policy: returnNull #服务降级返回null,用户需要对该值进行处理,不能抛出空指针异常 |
101 |
fallbackThrowException: |
|
102 |
policy: throwException #服务降级抛出的异常为io.servicecomb.core.exception.CseException,降级时,用户需要捕获该异常做自己的逻辑 |
103 |
fallbackForce: |
|
104 |
policy: mycustom |
105 |
#熔断策略支持全局、微服务和方法级别 |
|
106 |
circuitBreaker: |
107 |
Consumer: |
|
108 |
springmvc: |
109 |
codeFirst: |
|
110 |
fallbackFromCache: |
111 |
enabled: true #是否开启熔断 |
112 |
forceOpen: true #强制开启熔断 |
113 |
forceClosed: false #强制关闭熔断,和forceOpen互斥 |
|
114 |
sleepWindowInMilliseconds: 15000 #熔断时间,默认15000毫秒 |
115 |
requestVolumeThreshold: 20 #统计时间窗内最少请求次数,如果没有达到该请求次数不会进行熔断,即使失败率达到熔断要求 |
116 |
errorThresholdPercentage: 50 #失败率,统计时间窗内请求错误率,达到该限制后会进行熔断,默认50% |
117 |
#负载均衡、路由策略,重试机制支持全局和微服务两个级别 |
|
118 |
loadbalance: |
119 |
bservice: |
|
120 |
retryEnabled: true #是否开启重试机制 |
121 |
retryOnSame: 1 #在同一个机器上重试次数,默认为0,重试需要保证可重入性、幂等性 |
122 |
retryOnNext: 2 #在另外实例上重试次数,默认为0,如果是无状态的请求,建议选择在下一个节点上行进行重试 |
123 |
retryHandler: default #重试handler,默认为default,对应com.netflix.client.DefaultLoadBalancerRetryHandler,也可以实现自己的重试机制。可选 |
|
124 |
transactionControl: |
125 |
options: |
|
126 |
tag0: value0 #过滤器的属性,到时候只选择实例也有同样的属性的实例 |
127 |
policy: io.servicecomb.loadbalance.filter.SimpleTransactionControlFilter #分流策略,默认使用简单的分流策略,选择properties包含filter的所有options的所有实例,即filter的options为所选实例的properties的一个子集 |
|
128 |
isolation: # 支持服务级别和全局 |
129 |
enabled: true #开启隔离机制 |
|
130 |
errorThresholdPercentage: 20 #隔离错误率 |
131 |
enableRequestThreshold: 20 #隔离门槛 |
|
132 |
singleTestTime: 10000 #隔离后有机会重试的时间 |
133 |
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule.RoundRobinRule #已废弃 |
|
134 |
strategy: |
135 |
name: RoundRobin #现在支持RoundRobin轮询 Random随机 WeightedResponse返回值权重 SessionStickiness会话粘滞,默认为RoundRobin |
|
136 |
SessionStickinessRule: #当会话粘滞策略开启后生效 |
137 |
sessionTimeoutInSeconds: 30 #会话粘滞的时间,默认30s,可选 |
|
138 |
successiveFailedTimes: 5 #会话 粘滞最大错误数,默认5次,可选 |
139 |
serverListFilters: darklaunch,zoneaware #lb服务选择过滤器,现在主要提供灰度发布和az亲缘 |
|
140 |
serverListFilter: |
141 |
darklaunch: |
|
142 |
className: com.huawei.paas.darklaunch.DarklaunchServerListFilter #如果在filter里面配置了,需要配置对应的实现 |
143 |
zoneaware: |
|
144 |
className: io.servicecomb.loadbalance.filter.ZoneAwareServerListFilterExt #如果在filter里面配置了,需要配置对应的实现 |
145 |
references: |
|
146 |
version-rule: 0+ #对所有服务的版本依赖范围 |
147 |
abcservice: |
|
148 |
version-rule: 1.0.1+ #对特定的服务版本依赖范围 |
149 |
transport: rest #当服务端开启多种协议是,显示指定传输协议,默认为空,可设置为“”、rest、highway |
|
150 |
executor: |
151 |
default: |
|
152 |
thread-per-group: 200 # 同步开发模式下面的默认工作线程数 |
153 |
ssl: |
|
154 |
engine: openssl |
155 |
protocols: TLSv1.2 |
|
156 |
authPeer: false |
157 |
checkCN.host: false |
|
158 |
trustStore: trust.jks |
159 |
trustStoreType: JKS |
|
160 |
trustStoreValue: Test1234_ |
161 |
keyStore: server.p12 |
162 |
keyStoreType: PKCS12 |
163 |
keyStoreValue: Test1234_ |
|
164 |
crl: revoke.crl |
165 |
sslCustomClass: com.service.comment.DemoSSLCustom |
- Seter/Geter
Model定义需要符合JavaBean规范,CSE SDK强依赖于契约,CodeFirst模式下会自动生成契约,自动生成契约的Model属性顺序依赖于JavaBean的定义。如果顺序不对,CSE做强一致性检查时直接报错,导致服务偶尔能注册成功,偶尔注册失败。
1、boolean类型的属性名称不要以is开头。
2、属性名称不要使用大写字母开头。
- 性能调优
1、同步开发模式下,根据业务接口调整默认工作线程,默认为CPU个数。
-
Xml 代码
1 |
thread-per-group: 200 |
2、同步开发模式下,根据业务需要,动态调整thread-count,默认为1,一般建议配置成cpu*2
-
Xml 代码
1 |
thread-count: 8 |
3、根据接口时延,调整Http连接池大小,但是不建议连接数配置过大。按经验不要超过50,最好是进行压力测试得出一个比较合理的值。
-
Xml 代码
1 |
maxPoolSize: 10 |
4、同步开发转成全异步开发模式,难度很大,难以实施。
5、调整虚拟机启动参数。
6、如果使用Https连接,建议使用openssl作为SSLEngine。
-
Xml 代码
1 |
ssl: |
|
2 |
engine: openssl |