2019-04-16(Spring-boot整合華為微服務(wù))

前言:

前人踩坑為后人鋪路,作者在云化Spring-boot2.0項(xiàng)目時(shí)遇到的一些坑,本網(wǎng)頁(yè)持續(xù)更新,需要的朋友可以Ctrl+D收藏一下?。ㄈA為微服務(wù))

  • 起初遇到問(wèn)題:

根據(jù)華為云給出的demo添加相應(yīng)的pom依賴:


圖1
  • 配置microservice.yaml文件注釋已添加:
APPLICATION_ID: example-demo-2 #應(yīng)用名
service_description:
  name: example-demo-bmi-2 #微服務(wù)名
  version: 0.4.9  #微服務(wù)版本號(hào)
  properties:
    allowCrossApp: false
cse:
  service: #服務(wù)中心信息,其中address為服務(wù)中心地址
    registry:
      address: https://cse.cn-north-1.myhuaweicloud.com:443
      instance:
        watch: false  #使用API網(wǎng)關(guān)訪問(wèn),只能使用PULL模式

  config: #配置中心信息,其中address為配置中心地址
    client:
      serverUri: https://cse.cn-north-1.myhuaweicloud.com:443
      refreshMode: 1
      refresh_interval: 5000
  monitor: #服務(wù)看板信息,其中address為服務(wù)看板地址
    client:
      serverUri: https://cse.cn-north-1.myhuaweicloud.com:443
  rest:
    address: 0.0.0.0:7080 #微服務(wù)端口,請(qǐng)確保該端口號(hào)無(wú)沖突
  #秘鑰可在用戶下拉我的憑證 創(chuàng)建秘鑰
  credentials:
    accessKey: ***********
    secretKey: *******************
    akskCustomCipher: default
    project: cn-north-1 #項(xiàng)目名,如不配置,優(yōu)先取服務(wù)中心host的第二個(gè)字段,此處為cn-north-1;若無(wú)法解析,則配置為default,可能導(dǎo)致token認(rèn)證失敗。
#microservice.yaml配置支持對(duì)靜態(tài)頁(yè)面訪問(wèn) urlPattern :任意名  訪問(wèn)前臺(tái) host+urlPattern定義名+controller path
servicecomb:
  rest:
    servlet:
      urlPattern: /servicecomb/* #urlPattern 這個(gè)配置項(xiàng)的含義就是將它的路徑改為一個(gè)和靜態(tài)頁(yè)面不沖突的路徑,以保證靜態(tài)頁(yè)面能夠被正常訪問(wèn)。

  • 項(xiàng)目編譯正常,Run時(shí)發(fā)現(xiàn)項(xiàng)目報(bào)錯(cuò)錯(cuò)誤信息如下:
Exception in thread "main" java.lang.AbstractMethodError: 
org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Zatorg.springframework.context.event.GenericApplicationListenerAdapter.supportsSourceType

網(wǎng)上查了很多原因也試了幾種方案都不可行,最后在google找到如下回答:
原因在于:ConfigFileApplicationListener 沒(méi)有實(shí)現(xiàn) SmartApplicationListener 接口的方法:

public class ConfigFileApplicationListener
      implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
supportsSourceType() // 沒(méi)實(shí)現(xiàn)
}

根本原因在于版本依賴錯(cuò)誤發(fā)現(xiàn)版本不一致造成


圖2

parent版本為2.1.3 后我又去找了cse-dependency-spring-boot2相應(yīng)的文件


image.png

cse版本為2.3.52 對(duì)應(yīng)maven pom文件如下示:
圖3

看到這里問(wèn)題出的很明了了。最后看了最近所有cse版本發(fā)現(xiàn)大都是Spring-Boot 2.0.4 版本!

華為微服務(wù)JAVA-SDK 歷史版本https://support.huaweicloud.com/productdesc-cse/cse_productdesc_0008.html

  • 接口Api常見(jiàn)問(wèn)題:

開(kāi)發(fā)階段,由于存在頻繁的接口修改,又不想頻繁修改版本號(hào),容易本地和服務(wù)中心契約不一致,且契約未被允許更新到服務(wù)中心,導(dǎo)致調(diào)試的時(shí)候接口調(diào)用失敗的情況。
推薦使用CSE提供了微服務(wù)按environment區(qū)分、隔離的能力(當(dāng)前支持development和production),允許處于development環(huán)境的微服務(wù)在不升級(jí)版本的情況下,僅需重啟服務(wù)即可重新注冊(cè)契約到服務(wù)中心。

所有微服務(wù)在microservice.yaml中增如下配置,且需要在Provider啟動(dòng)后,再重啟Consumer(若請(qǐng)求走edge,需要重啟edge服務(wù)):

  name: xxx-service
  version: 0.0.1
  environment: development
  • 開(kāi)發(fā)階段,由于存在頻繁的接口修改,也不會(huì)清理服務(wù)中心的數(shù)據(jù),容易出現(xiàn)調(diào)試的時(shí)候接口調(diào)用失敗的情況。

推薦使用華為公有云在線的服務(wù)中心,可以直接登錄使用微服務(wù)引擎提供的微服務(wù)管理功能刪除微服務(wù)或微服務(wù)實(shí)例。

微服務(wù)引擎也提供了本地輕量化服務(wù)中心,將服務(wù)停止后即可清理服務(wù)中心數(shù)據(jù)。

下載本地本地輕量化服務(wù)中心解壓后目錄結(jié)構(gòu)如圖4示:

圖4

啟動(dòng)服務(wù)會(huì)占用本地30103和30100端口,若端口被占用請(qǐng)自行更改config文件夾下app.config文件。啟動(dòng)成功后訪問(wèn) 127.0.0.1:300103。

  • 如何測(cè)試項(xiàng)目及服務(wù)契約注冊(cè)成功:

在所需接口類(lèi)上加@RestSchema+@RequestMapping注解接口方法加@RequestMapping注解具體參數(shù)根據(jù)業(yè)務(wù)而定。例子如下:

/*
 發(fā)布服務(wù)
 在服務(wù)的實(shí)現(xiàn)類(lèi)上打上注解@RestSchema,指定schemaId,表示該實(shí)現(xiàn)作為當(dāng)前微服務(wù)的一個(gè)schema發(fā)布
 CSE使用@RestSchema聲明服務(wù),并且需要顯示的使用@RequestMapping聲明服務(wù)路徑
 以區(qū)分該服務(wù)是采用Spring MVC的標(biāo)簽還是使用JAX RS的標(biāo)簽
 */
@RestSchema(schemaId = "bmi")
@RequestMapping(path = "/example/demo/bmi", produces = MediaType.APPLICATION_JSON)
public class BmiImpl {
    /*
    *RestTemplateBuilder.create()獲取restTemplate實(shí)例
    *若調(diào)用其他微服務(wù)方法獲取url格式為 cse://微服務(wù)名/方法名
    * */
    RestTemplate template = RestTemplateBuilder.create();
    
    @Autowired
    private BmiDelegate userBmiDelegate;
    private static Logger LOGGER = LoggerFactory.getLogger(BmiImpl.class);

    @RequestMapping(value = "/helloworld",
        produces = { "application/json" }, 
        method = RequestMethod.GET)
    public String helloworld( @RequestParam(value = "name", required = true) String name){

        return userBmiDelegate.helloworld(name);
    }
}

相關(guān)含義如上圖示!
啟動(dòng)項(xiàng)目訪問(wèn)本地服務(wù)中心,可以看到項(xiàng)目注冊(cè)成功,點(diǎn)擊項(xiàng)目名稱查看實(shí)例 服務(wù)契約為我們所定義的RestFul接口,可進(jìn)行接口測(cè)試,end!


圖6

圖7
  • Swagger :

Swagger API Spec對(duì)Rest API的每一個(gè)操作的請(qǐng)求消息的參數(shù)(Path,Query,Body,Form),響應(yīng)消息的狀態(tài)碼和消息體的json結(jié)構(gòu)都進(jìn)行了詳細(xì)的描述。如果需要查看詳細(xì)的Swagger API Spec定義,請(qǐng)參考http://swagger.io/specification/(本項(xiàng)目支持swagger注解開(kāi)發(fā)?。?/em>
Swagger官網(wǎng):http://swagger.io/
Swagger Github:https://github.com/swagger-api
Swagger Editor在線demo:http://editor.swagger.io
Swagger UI在線demo:http://petstore.swagger.io

By.Minko 2019-4-18 15:53:44持續(xù)更新中....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容