超实用的CSE开发经验总结!!!

时间:2024-04-04 14:02:14

  做CSE的开发有一段时间了,前段时间太忙,现在终于有空总结了一些在CSE开发方面的经验,大伙看看是不是有用?

  • 项目管理
  1. 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推荐的依赖。如果想按需加载,需要自己根据实际功能来进行选择。功能列表如下:

超实用的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