GitHub项目cloud-phantom,里面包含全套的Spring Cloud生态体系的构建。从 eureka/config/zuul/hystrix/turbine/admin/zipkin等配置一应俱全,同时配置说明文档(正在不断完善),欢迎star
1.动态刷新
项目依赖中需要引入actuator的依赖包,并且需要动态刷新的容器bean上需要加上@RefreshScope注解才生效。
1.FeignClient编写
不要在类上使用@RequestMapping注解,否则在使用fallback的时候,会报错(重复声名),因为注解会被继承。
每个参数的注解都要写全,例如@RequestParam(value=”name”)
2.打印Feign日志
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
logging.level.=debug
//例如
logging.level.com.kingboy.feign.UserFeign
3.feign使用Hystrix断路器不生效,不进行回退方法
不知道什么原因,总之配置没有打开,在配置文件中新加如下内容
feign.hystrix.enabled=true
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网关)中配置如下内容
@Configuration
public class CrossFilter extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
String[] origins = {"*"};
registry.addMapping("/**")
.allowedOrigins(origins)
.allowCredentials(true)
.allowedMethods("*")
.maxAge(3600);
}
}