SpringMvc項目接入SpringCloud微服務的解決方案

SpringMvc項目接入SpringCloud微服務的解決方案

在SpringBoot項目大行其道的時代,仍有很多項目是基於SpringMvc,甚至是基於struts的,這些項目的特點是年代久遠,項目龐大,設計文檔存在缺漏。但是對於這些項目,我們不能放任不管,甚至很多項目還在爲公司創造這價值。
隨着公司業務的發展,原先的單體項目已經不能滿足快速發展變化的業務的需求,這時候就要進行微服務改造。

方案一:Sidecar異構接入

Sidecar異構架構
Sidecar項目可以看作老項目的影子項目,由Sidecar負責接入註冊中心,並且發起遠程調用和被遠程調用。兩個項目爲一個整體對外提供服務。

優勢:

  1. sidecar可以無視語言,可以用於代理古老的java項目,也可以異構代理其他語言項目,如php、python、nodejs等
  2. sidecar可以在不對老項目進行大規模改造的情況下快速接入SpringCloud微服務,漸進式的做微服務拆分

劣勢

  1. 增加項目架構和維護的複雜度,多一個項目多一個環境意味着出問題的概率又多一分

Sidecar項目配置

  1. 老項目添加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;
    }
}
  1. 新建sidecar maven項目
  2. 引入依賴
<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>
  1. 項目啓動類加入如下註解
@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章