Eureka
- 可以用Restration…getServiceId()来获得当前服务(也就是这个微服务)的ID
- 可以用DiscoveryClient.getInstances(服务的ID)来获得特定服务的所有实例(实例就是一个微服务可以跑好多个,放在不同端口中,其他代码都一样)
- 在做高集群多个服务注册中心时,千万要记住eureka.instance.hostname不能一样,spring.application.name要一样,发现服务和注册自己要都打开(默认打开)
- 服务注册中心如果是多个节点但是某一个微服务只在其中一个注册中心注册,其他注册中心或许会在运行中同步,但是一旦那个注册的注册中心下线,其他服务中心也找不到该微服务,所以这样做高集群在出问题的时候很脆弱。
- consumer可以用restTemplate来访问producer
- 创建多个实例的方法就是在run configuration中创建多个spring boot运行实例,并且使用不同的端口即可
- 不能将server.port设为随机,会导致注册时的端口和在tomcat中使用的端口不一致,从而导致注册时发现是一样的,而不能消费服务。
Hystrix
- 在使用dashboard时,在cloud2.X的版本后,还需要配置dashboard的servlet:
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
- 同样的,在使用turbine时,可以发现turbin的自动监控地址是```/actuator/hystrix.stream",会导致turbine的显示一直为loading,所以在application.properties可以加上如下属性设置语句:
turbine.instanceUrlSuffix=hystrix.stream
同时如果发现开启了多个服务实例,host却显示为1,是因为没有其他实例被请求
Config
- 在使用spring-cloud-config时,一定要在bootstrap.properties中设置spring-application-name,并且在application.properties中不能再去设置,否则会覆盖掉bootstrap中的设置,导致无法找到相应的远程配置文件。
- 在使用服务化配置配置中心的时候,注意要包含注册中心的配置,而不是在application.properties中配置
- 在使用动态刷新配置的时候要注意新版本中使用/refresh时需要手动暴露这个节点,在bootstrap中加上代码:
management.endpoints.web.exposure.include= refresh
,而后用post请求的方式对http:localhost:{port}/actuator/refresh```进行请求,就可以自动更新配置了
Bus
- 在配合Rabbitmq做config的同步时,不再使用/bus/refresh,而是需要配置:
management.endpoints.web.exposure.include=bus-refresh
并且使用/actuator/bus-refresh来进行刷新才能同步不同的client - 在使用kafka做config同步时,需要注意如果cloud的版本在2.0以上时,需要使用1.XX的kafka,并且在更换kafka版本的时候,windows环境需要注意清空log日志。
- 在跟踪信息时,需要配置:
spring.cloud.bus.trace.enabled=true
同时会发现在httptraceEndpoint中endpoint被修改为了httptrace,所以需要同时暴露该节点:management.endpoint.web.exposure.include=httptrace
并且在/acturator/httptrace中使用
Feign
- feign在复杂对象传输时,会转换为LinkedHashMap,需要用类似如下代码进行转换:
ObjectMapper mapper = new ObjectMapper();
XXX result = mapper.convertValue(xx.getxxxx(),
XXXX.class);
Stream
- channel中的输入输出通道名不能相同,但是可以在properties中配置到同一个destination:
spring.cloud.stream.bindings.XXX.destination=ZZZ
spring.cloud.stream.bindings.YYY.destination=ZZZ
Sleuth
- springboot2.12之后的版本已经不支持内嵌的zipkin,所以需要配置外部的zipkin,可以使用docker来完成安装,具体可见zipkin官方:https://github.com/apache/incubator-zipkin