前言:
前人踩坑为后人铺路,作者在云化Spring-boot2.0项目时遇到的一些坑,本网页持续更新,需要的朋友可以Ctrl+D收藏一下!(华为微服务)
-
起初遇到问题:
根据华为云给出的demo添加相应的pom依赖:
图1
- 配置microservice.yaml文件注释已添加:
APPLICATION_ID: example-demo-2 #应用名
service_description:
name: example-demo-bmi-2 #微服务名
version: 0.4.9 #微服务版本号
properties:
allowCrossApp: false
cse:
service: #服务中心信息,其中address为服务中心地址
registry:
address: https://cse.cn-north-1.myhuaweicloud.com:443
instance:
watch: false #使用API网关访问,只能使用PULL模式
config: #配置中心信息,其中address为配置中心地址
client:
serverUri: https://cse.cn-north-1.myhuaweicloud.com:443
refreshMode: 1
refresh_interval: 5000
monitor: #服务看板信息,其中address为服务看板地址
client:
serverUri: https://cse.cn-north-1.myhuaweicloud.com:443
rest:
address: 0.0.0.0:7080 #微服务端口,请确保该端口号无冲突
#秘钥可在用户下拉我的凭证 创建秘钥
credentials:
accessKey: ***********
secretKey: *******************
akskCustomCipher: default
project: cn-north-1 #项目名,如不配置,优先取服务中心host的第二个字段,此处为cn-north-1;若无法解析,则配置为default,可能导致token认证失败。
#microservice.yaml配置支持对静态页面访问 urlPattern :任意名 访问前台 host+urlPattern定义名+controller path
servicecomb:
rest:
servlet:
urlPattern: /servicecomb/* #urlPattern 这个配置项的含义就是将它的路径改为一个和静态页面不冲突的路径,以保证静态页面能够被正常访问。
- 项目编译正常,Run时发现项目报错错误信息如下:
Exception in thread "main" java.lang.AbstractMethodError:
org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Zatorg.springframework.context.event.GenericApplicationListenerAdapter.supportsSourceType
网上查了很多原因也试了几种方案都不可行,最后在google找到如下回答:
原因在于:ConfigFileApplicationListener 没有实现 SmartApplicationListener 接口的方法:
public class ConfigFileApplicationListener
implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
supportsSourceType() // 没实现
}
根本原因在于版本依赖错误发现版本不一致造成
图2
parent版本为2.1.3 后我又去找了cse-dependency-spring-boot2相应的文件
image.png
cse版本为2.3.52 对应maven pom文件如下示: 图3
看到这里问题出的很明了了。最后看了最近所有cse版本发现大都是Spring-Boot 2.0.4 版本!
华为微服务JAVA-SDK 历史版本https://support.huaweicloud.com/productdesc-cse/cse_productdesc_0008.html
-
接口Api常见问题:
开发阶段,由于存在频繁的接口修改,又不想频繁修改版本号,容易本地和服务中心契约不一致,且契约未被允许更新到服务中心,导致调试的时候接口调用失败的情况。
推荐使用CSE提供了微服务按environment区分、隔离的能力(当前支持development和production),允许处于development环境的微服务在不升级版本的情况下,仅需重启服务即可重新注册契约到服务中心。
所有微服务在microservice.yaml中增如下配置,且需要在Provider启动后,再重启Consumer(若请求走edge,需要重启edge服务):
name: xxx-service
version: 0.0.1
environment: development
- 开发阶段,由于存在频繁的接口修改,也不会清理服务中心的数据,容易出现调试的时候接口调用失败的情况。
推荐使用华为公有云在线的服务中心,可以直接登录使用微服务引擎提供的微服务管理功能删除微服务或微服务实例。
微服务引擎也提供了本地轻量化服务中心,将服务停止后即可清理服务中心数据。
下载本地本地轻量化服务中心解压后目录结构如图4示:
启动服务会占用本地30103和30100端口,若端口被占用请自行更改config文件夹下app.config文件。启动成功后访问 127.0.0.1:300103。
-
如何测试项目及服务契约注册成功:
在所需接口类上加@RestSchema+@RequestMapping注解接口方法加@RequestMapping注解具体参数根据业务而定。例子如下:
/*
发布服务
在服务的实现类上打上注解@RestSchema,指定schemaId,表示该实现作为当前微服务的一个schema发布
CSE使用@RestSchema声明服务,并且需要显示的使用@RequestMapping声明服务路径
以区分该服务是采用Spring MVC的标签还是使用JAX RS的标签
*/
@RestSchema(schemaId = "bmi")
@RequestMapping(path = "/example/demo/bmi", produces = MediaType.APPLICATION_JSON)
public class BmiImpl {
/*
*RestTemplateBuilder.create()获取restTemplate实例
*若调用其他微服务方法获取url格式为 cse://微服务名/方法名
* */
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);
}
}
相关含义如上图示!
启动项目访问本地服务中心,可以看到项目注册成功,点击项目名称查看实例 服务契约为我们所定义的RestFul接口,可进行接口测试,end!
图6
图7
-
Swagger :
Swagger API Spec对Rest API的每一个操作的请求消息的参数(Path,Query,Body,Form),响应消息的状态码和消息体的json结构都进行了详细的描述。如果需要查看详细的Swagger API Spec定义,请参考http://swagger.io/specification/(本项目支持swagger注解开发!)
Swagger官网: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持续更新中....
网友评论