基于華為云CSE微服務接口兼容常見問題

      網友投稿 1620 2025-04-01

      微服務接口兼容常見問題


      在進行微服務持續迭代開發的過程中,由于新特性在不停的加入,一些過時的特性在不停的修改,接口兼容問題面臨巨大的挑戰,特別是在運行環境多版本共存(灰度發布)的情況下。本章節主要描述接口兼容管理的一些實踐建議,以及在使用CSE過程中碰到了兼容性問題的解決辦法。由于微服務一般都通過REST接口對外提供服務,沒有特殊說明的情況下,這里的接口都指REST接口。

      保證接口兼容的實踐

      為了防止接口兼容問題,開發者在進行接口變更(新增、修改、刪除等)的時候,建議遵循下面的一些原則。

      只增加接口,不修改、不刪除接口。

      作為Provider,增加接口的時候,相應的將微服務版本號遞增。比如將2.1.2修改為2.1.3。版本號按照規范使用x.y.z的格式,只包含數字便于管理,建議每位數字不大于125。

      作為Consumer,使用Provider的新接口時候,指定Provider的最小版本號。比如:cse.references.[serviceName].version-rule=2.1.3+,其中serviceName為Provider的微服務名稱。

      基于華為云CSE微服務接口兼容常見問題

      在服務中心,定期清理不再使用的老版本的微服務信息。

      ServiceComb還有如下一些注意事項:

      修改微服務信息,必須升級版本號,因為服務注冊的時候,不會覆蓋已經注冊的微服務信息。

      接口兼容常見問題及其解決辦法

      開發階段,由于存在頻繁的接口修改,又不想頻繁修改版本號,容易本地和服務中心契約不一致,且契約未被允許更新到服務中心,導致調試的時候接口調用失敗的情況。

      推薦使用CSE提供了微服務按environment區分、隔離的能力(當前支持development和production),允許處于development環境的微服務在不升級版本的情況下,僅需重啟服務即可重新注冊契約到服務中心。

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

      service_description: ??name:?xxx-service ??version:?0.0.1 ??environment:?development

      開發階段,由于存在頻繁的接口修改,也不會清理服務中心的數據,容易出現調試的時候接口調用失敗的情況。

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

      微服務引擎也提供了本地輕量化服務中心,將服務停止后即可清理服務中心數據。服務中心及其frontend代碼已開源,項目地址。

      發布階段,需要審視下接口兼容的實踐的步驟,確保不在線上引入接口兼容問題。如果不小心漏了其中的某個步驟,則可能導致如下一些接口兼容問題:

      [ ] 如果修改、刪除接口:導致一些老的Consumer將請求路由到新的Provider,調用失敗。

      解決辦法:指定Provider的版本號、或修改Consumer適配新的Provider。

      [ ] 如果忘記修改微服務版本號:導致一些新的Consumer將請求路由到老的Provider,調用失敗。

      解決辦法:升級Provider版本號、刪除老的Provider實例、重啟Consumer。

      [ ] 如果忘記配置Consumer的最小依賴版本:當部署順序為先停止Consumer,再啟動Consumer,再停止Provider,再啟動Provider的情況,Consumer無法獲取到新接口信息,就采用了老接口,當Provider啟動以后,Consumer發起對新接口的調用會失敗;或者在Provider沒啟動前,調用新接口失敗等。

      解決辦法:建議先啟動Provider,再啟動Consumer。

      通用規避措施:出現的接口兼容問題不同,處理方式會有差異。極端情況,只需要清理Provider、Consumer的微服務信息,然后重啟微服務即可。當服務調用關系復雜的情況下,接口兼容問題影響范圍會更加廣泛,同時清理Provider、Consumer數據會變得復雜,因此建議遵循上面的規范,避免不兼容的情況發生。

      常見的接口不兼容情況的日志

      consumer method [com.huawei.paas.cse.demo.CodeFirstPojoIntf:testUserMap] not exist in swagger

      可能是Provider增加了接口,但是沒有更新版本號。需要刪除微服務數據或者更新版本號后重新啟動Provider,并重啟Consumer。

      契約或接口變更(含增刪查改、參數變化等),但environment未設定為development,契約不允許更新。schemaId為download、upload的兩個契約已存在,但新增的schemaId為TaskTemplateController的無法注冊,相應接口自然會調用失敗。需要升級版本號,或指定environment為development。

      2018-06-14?22:51:55,239?[ERROR]?SchemaIds?is?different?between?local?and?service?center.?Please?change?microservice?version.?id=1f4c94c66fe011e8945700ff37174dd4?appId=uploadapp,?name=upload-service,?version=0.0.1,?local?schemaIds=[download,?upload,?TaskTemplateController],?service?center?schemaIds=[download,?upload]?org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.checkSchemaIdSet(MicroserviceRegisterTask.java:116) 2018-06-14?22:51:55,243?[INFO]?schemaId?download?exists?true?org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144) 2018-06-14?22:51:55,246?[INFO]?schemaId?upload?exists?true?org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144) 2018-06-14?22:51:55,249?[WARN]?get?response?for?org.apache.servicecomb.serviceregistry.api.response.GetExistenceResponse?failed,?400:Bad?Request,?{"errorCode":"400016","errorMessage":"Schema?does?not?exist","detail":"schema?does?not?exist."} ?org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.lambda$null$0(ServiceRegistryClientImpl.java:118) 2018-06-14?22:51:55,250?[INFO]?schemaId?TaskTemplateController?exists?false?org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.registerSchemas(MicroserviceRegisterTask.java:144) 2018-06-14?22:51:55,258?[ERROR]?Register?schema?1f4c94c66fe011e8945700ff37174dd4/TaskTemplateController?failed,?statusCode:?400,?statusMessage:?Bad?Request,?description:?{"errorCode":"400014","errorMessage":"Undefined?schema?id","detail":"schemaId?non-exist,?can't?be?added,?environment?is?production"} .?org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.registerSchema(ServiceRegistryClientImpl.java:306)

      Provider無可用版本,請查Provider和Consumer是否屬于同一environment(默認為空字符串),且成功注冊到服務中心。

      2018-06-15?11:03:56,045?[ERROR]?invoke?failed,?invocation=PRODUCER?rest?customer-service.reactiveClient.hello?org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter.convert(DefaultExceptionToResponseConverter.java:35) java.lang.IllegalStateException:?Probably?invoke?a?service?before?it?is?registered,?appId=uploadapp,?name=upload-service ????at?org.apache.servicecomb.core.definition.schema.ConsumerSchemaFactory.getOrCreateMicroserviceMeta(ConsumerSchemaFactory.java:90) ????at?org.apache.servicecomb.core.provider.consumer.ReferenceConfig.(ReferenceConfig.java:36) ????at?org.apache.servicecomb.core.provider.consumer.ConsumerProviderManager.getReferenceConfig(ConsumerProviderManager.java:82)

      本地開發調試時無法使用部分云上儀表盤功能,會出現下述異常,不影響功能,可以忽略。可以通過設置cse.monitor.client.enable為false禁用儀表盤功能。

      2018-06-14?22:23:59,407?[WARN]?{"errorCode":"400012","errorMessage":"Micro-service?does?not?exist","detail":"provider?not?exist,?consumer?8e24bc416fde11e8945700ff37174dd4?find?provider?default/CseMonitoring/latest"} ?org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.lambda$null$4(ServiceRegistryClientImpl.java:199) 2018-06-14?22:23:59,408?[ERROR]?Can?not?find?any?instances?from?service?center?due?to?previous?errors.?service=default/CseMonitoring/latest?org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry.findServiceInstances(AbstractServiceRegistry.java:256)

      下面兩種錯誤(前者直接消費upload-service,后者通過edge-service消費upload-service)均表示接口未注冊到服務中心或消費者未拿到最新契約,調用報locate path failed. 請排除:1、Provider對應接口契約已注冊到服務中心,內容與本地應用啟動時輸出一致;2、確保Consumer和edge-service在Provider啟動后,手動重啟以重新獲取Provider契約信息;3、Debug啟動Consumer,找到ConsumerSchemaFactory類中的loadSwagger(位于servicecomb的java-chassis-core包中),查看schemaContent內容是否拿到Consumer對應契約內容。

      2018-06-15?14:52:45,312?[ERROR]?locate?path?failed,?status:Not?Found,?http?method:GET,?path:/favicon.ico/,?microserviceName:upload-service?org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:72)

      2018-06-15?14:56:35,342?[ERROR]?locate?path?failed,?status:Not?Found,?http?method:POST,?path:/taskTemplate/uploadTaskTemplate/,?microserviceName:upload-service?org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:72) 2018-06-15?14:56:35,344?[ERROR]?edge?server?failed.?org.apache.servicecomb.edge.core.AbstractEdgeDispatcher.onFailure(AbstractEdgeDispatcher.java:33) InvocationException:?code=404;msg=CommonExceptionData?[message=Not?Found] ????at?org.apache.servicecomb.common.rest.locator.OperationLocator.locate(OperationLocator.java:77) ????at?org.apache.servicecomb.common.rest.locator.ServicePathManager.consumerLocateOperation(ServicePathManager.java:107) ????at?org.apache.servicecomb.edge.core.EdgeInvocation.locateOperation(EdgeInvocation.java:114) ????at?org.apache.servicecomb.common.rest.AbstractRestInvocation.findRestOperation(AbstractRestInvocation.java:77) ????at?org.apache.servicecomb.edge.core.EdgeInvocation.edgeInvoke(EdgeInvocation.java:66) ????at?com.huawei.cse.houseapp.edge.ApiDispatcher.onRequest(ApiDispatcher.java:84) ????at?io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:223)

      消費接口時Content-Type不一致將報參數非法,如前端使用form-data,Provider需要application/json

      2018-06-27?14:51:13,939?[ERROR]?invoke?failed,?invocation=PRODUCER?rest?loadbalance-isolation-server.hello.sayHello?org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter.convert(DefaultExceptionToResponseConverter.java:35) java.lang.IllegalArgumentException:?argument?type?mismatch ????at?sun.reflect.NativeMethodAccessorImpl.invoke0(Native?Method) ????at?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ????at?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ????at?java.lang.reflect.Method.invoke(Method.java:498)

      微服務引擎 CSE 微服務

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:微軟為iPad而非安卓平板開發Office的原因(ipad office和windows一樣嗎)
      下一篇:表格如何設置萬為單位(表格怎么設置萬為單位)
      相關文章
      亚洲av午夜精品无码专区| 亚洲av午夜精品一区二区三区| 亚洲 国产 图片| 亚洲春黄在线观看| 久久精品国产精品亚洲精品 | 中文字幕精品三区无码亚洲 | 亚洲色最新高清av网站| 亚洲成人福利在线观看| 亚洲一区二区在线视频| 国产成人A人亚洲精品无码| 亚洲国产精品视频| 朝桐光亚洲专区在线中文字幕 | 亚洲美女视频一区| 91亚洲国产在人线播放午夜| 亚洲成av人影院| 久久精品国产亚洲网站| 亚洲熟女一区二区三区| 超清首页国产亚洲丝袜| 亚洲精品A在线观看| 亚洲第一区精品日韩在线播放| 成人亚洲国产精品久久| 亚洲av午夜电影在线观看| 豆国产96在线|亚洲| 亚洲国产综合精品一区在线播放| 国产成人精品久久亚洲高清不卡 | 亚洲另类少妇17p| 国产偷v国产偷v亚洲高清| 亚洲国产美国国产综合一区二区| 亚洲一区中文字幕久久| 亚洲国产成人手机在线电影bd| va天堂va亚洲va影视中文字幕 | 亚洲日韩AV一区二区三区中文| 亚洲国产av玩弄放荡人妇| 大胆亚洲人体视频| 国产亚洲精品成人a v小说| 亚洲色婷婷六月亚洲婷婷6月| 亚洲色欲色欲综合网站| 狠狠色香婷婷久久亚洲精品| 久久久亚洲精华液精华液精华液| 亚洲国产成人五月综合网| 亚洲国产精品无码专区|