SpringMvc項目接入SpringCloud微服務的解決方案
在SpringBoot項目大行其道的時代,仍有很多項目是基於SpringMvc,甚至是基於struts的,這些項目的特點是年代久遠,項目龐大,設計文檔存在缺漏。但是對於這些項目,我們不能放任不管,甚至很多項目還在爲公司創造這價值。
隨着公司業務的發展,原先的單體項目已經不能滿足快速發展變化的業務的需求,這時候就要進行微服務改造。
方案一:Sidecar異構接入
Sidecar項目可以看作老項目的影子項目,由Sidecar負責接入註冊中心,並且發起遠程調用和被遠程調用。兩個項目爲一個整體對外提供服務。
優勢:
- sidecar可以無視語言,可以用於代理古老的java項目,也可以異構代理其他語言項目,如php、python、nodejs等
- sidecar可以在不對老項目進行大規模改造的情況下快速接入SpringCloud微服務,漸進式的做微服務拆分
劣勢
- 增加項目架構和維護的複雜度,多一個項目多一個環境意味着出問題的概率又多一分
Sidecar項目配置
- 老項目添加HealthController
/**
* @Usage: 用於健康檢查
*/
@RestController
public class HealthController {
@RequestMapping("/openapi/health/status")
public Map status(){
Map<String, String> map = new HashMap<>(1);
map.put("status","UP");
return map;
}
}
- 新建sidecar maven項目
- 引入依賴
<dependencies>
<!-- sidecar 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- eureka 註冊中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- hystrix 熔斷-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- feign 聲明式服務調用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
- 項目啓動類加入如下註解
@EnableFeignClients
@EnableSidecar
不用@EnableEurekaClient,因爲@EnableSidecar中包含來eureka的註冊邏輯
5. 配置文件增加sidecar、eureka、feign、hystrix、ribbon配置
重點講一下sidecar配置
sidecar:
# 配置接入web的端口
port: 8080
home-page-uri: http://localhost:${sidecar.port}/
# 配置接入web的健康檢查rest接口,sidecar將請求該url,用以確定接入應用是否存活.
health-uri: http://localhost:${sidecar.port}/openapi/health/status
方案二:升級SpringBoot並集成SpringCloud組件
一、升級SpringBoot 1.x版本
在不改動Spring版本的情況下引入SrpingBoot,將項目改造爲SpringBoot項目
SpringBoot 1.x 引用的Spring 4.x版本,而一般SpringMvc項目也是使用Spring4.x版本,如果使用Spring更老版本或未使用spring則另當別論。
二、升級SpringBoot 2.x版本
SpringBoot 2.x版本使用的是Spring5.x版本,升級2.x意味着升級spring並且需要解決spring升級帶來的問題
三、引入SpringCloud並集成SpringCloud組件
遇到的問題
集成Eureka時,Cannot create Jersey client錯誤
問題原因:jersey 與 fastjson 某些版本衝突導致服務無法啓動
錯誤:
Caused by: com.sun.jersey.spi.inject.Errors$ErrorMessagesException: null
解決方案:fastjson升級到 1.2.37以上版本
https://github.com/alibaba/fastjson/releases/tag/1.2.37
日期響應爲linux時間戳
升級SpringBoot後,原先的日期格式化失效,在不給字段加@JsonFormat註解的情況下便要思考通過全局配置來解決
正常配置
spring.jackson.time-zone=GMT+8
# 指定響應數據格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 指定不返回時間戳
spring.jackson.serialization.write-dates-as-timestamps=false
這樣配置後並沒有生效,繼續查找原因。
Finally, if you opt out of the Spring Boot default MVC configuration by providing your own @EnableWebMvc configuration, you can take control completely and do everything manually by using getMessageConverters from WebMvcConfigurationSupport.
《Spring Boot Reference Guide》
去掉@EnableWebMvc後,配置可以生效。
結合WebMvcAutoConfiguration理解@EnableWebMvc