九、Spring Cloud系列:实战经验总结

来源:互联网 发布:李宁淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 18:50

GitHub项目cloud-phantom,里面包含全套的Spring Cloud生态体系的构建。从 eureka/config/zuul/hystrix/turbine/admin/zipkin等配置一应俱全,同时配置说明文档(正在不断完善),欢迎star

一、 spring cloud config动态刷新

1.动态刷新

项目依赖中需要引入actuator的依赖包,并且需要动态刷新的容器bean上需要加上@RefreshScope注解才生效。

二、Feign的使用注意事项

1.FeignClient编写

  • 不要在类上使用@RequestMapping注解,否则在使用fallback的时候,会报错(重复声名),因为注解会被继承。

  • 每个参数的注解都要写全,例如@RequestParam(value=”name”)

  • 没写注解的参数,Feign会把参数放进body中,以post方式进行请求,即使请求方法是get。

2.打印Feign日志

  • 第一种方式:在配置类中增加如下内容
@Beanpublic Logger.Level feignLoggerLevel() {    return Logger.Level.FULL;}
  • 第二种方式:使用配置文件
logging.level.<fignClient的全路径>=debug//例如logging.level.com.kingboy.feign.UserFeign

3.feign使用Hystrix断路器不生效,不进行回退方法

不知道什么原因,总之配置没有打开,在配置文件中新加如下内容

feign.hystrix.enabled=true

三、Eureka使用

1.将实例以ip方式注册进Eureka(默认hostname)

在客户端配置中加入以下内容

eureka.instance.prefer-ip-address=true

2.在Eureka Client中配置多个注册中心地址

eureka:  client:    service-url:      defaultZone: http://localhost:7000/eureka/,http://localhost:7001/eureka/

3.Eureka服务发现注册慢的解决

Eureka Server配置更改的清理时间,让无效服务快速被清理掉

#eureka配置eureka:  server:    #设置扫描失效服务的间隔时间    eviction-interval-timer-in-ms: 20000

Eureka Client端的配置,更改续约和超时时间

#注册中心配置eureka:  instance:    #使用IP进行注册    prefer-ip-address: true    #配置实例的注册ID    instance-id: ${spring.cloud.client.ipAddress}:${server.port}    #心跳时间,即服务续约间隔时间(缺省为30s)    lease-renewal-interval-in-seconds: 5    #发呆时间,即服务续约到期时间(缺省为90s)    lease-expiration-duration-in-seconds: 10

4.更改Eureka Cliet的实例ID

#注册中心配置eureka:  instance:    #配置实例的注册ID    instance-id: ${spring.cloud.client.ipAddress}:${server.port}

其实并不是同时注册到多个注册中心,如果第一个注册成功,则接下来的不注册。如果第一eureka注册失败,才会尝试注册到第二个eureka上

四、开发环境的困扰

1.每个人都需要运行eureka和config才能使用

开发中每个人必须先启动本地eureka和config才能正常启动自己的开发服务。所以我们可以在一台服务器上部署一个eureka和config中心,将项目中的eureka和config地址全部指向服务器对应url即可。这样每个人只需要启动自己开发的服务即可。(但是这样做也有缺点)

五、分布式事物

事物让人很头疼,一开始想了数据库事物,分布式事物等处理方式,但是从效率和可用性上来说都不行。所以最好的方式就是不用事物,采用补偿的方式(可以参考TCC),用代码来保证数据一致性。(问过jd的某技术大牛,也没有使用事物,服务太多,效率太低)

六、日志如何记录,并可追踪?

我是使用logback进行日志记录的。基本思路是在服务中添加seluth的包,通过配置可以在日志中打印出traceId,spanId,parentId,(traceId标识整个请求的ID,spanId,本服务的本次请求id,parentID,调用我这个服务的服务请求id)

同时还使用logstash的依赖将日志保存成json文件,然后使用ELK对日志进行集中处理和搜索。
可以参考我的github项目cloud-phantom中的provider和consumer模块的处理

七、跨域问题

这是一个小的解决点了,我们项目使用vue进行sp开发,会产生跨域,只要在项目(更多是在zuul网关)中配置如下内容

@Configurationpublic class CrossFilter extends WebMvcConfigurerAdapter {    @Override    public void addCorsMappings(CorsRegistry registry) {        String[] origins = {"*"};        registry.addMapping("/**")                .allowedOrigins(origins)                .allowCredentials(true)                .allowedMethods("*")                .maxAge(3600);    }}