瑶台融合踩坑记录

1.新模块放入的时候需要把mybatis相关配置去掉,因为单体有统一的配置,如果每个模块再有就会有冲突,

现象时sql无法绑定

 

2.引入模块要注意jar包冲突问题。

 

3.单体服务在启动的时候rabbitmq queue无法创建,但是本地启动是可以的,最后发现是nocas出现问题引起的。

 

4.controller层mapping重复问题

原因:metadata项目中定义feign,是在接口中加上@requestmapping注解来定义路由信息,然后controller层实现该接口,改写法本身是没有问题的,@EnableFeignClients和@SpringBootApplication,扫描相同的接口包,各自注册。

但是单体项目把metadata项目合并了进来,同时其他模块(paas)又引入了metadata,导致metadata在加载完mapping后,又会在paas中加载导致路由冲突

方案:

(1)分析paas引用的是metadata的client模块,只要把feign中的接口移植出client模块即可,后续及时再有其他模块引用也没问题。

(2)增加配置过滤器扩展RequestMappingHandlerMapping,重新isHandler只有非接口的bean才进行路由注册,这样就排除了其他模块引入feign接口被扫描到的问题,从而解决这个问题

public class CCBRequestMappingHandlerMapping extends RequestMappingHandlerMapping {

@Override
protected boolean isHandler(Class<?> beanType) {

// 去掉RequestMapping Interface
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class)
|| (AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class)
&& beanType.isInterface() == false));
}
}

5.fegin使用问题总结

fegin是把url链接访问转换成接口调用的一种封装功能。之前controller层使用@@RequestMapping设置好mapping后就可以用HTTP进行访问,fegin可以把这种方式变成接口调用,方便使用。

方式1:通过@FeignClient注解指定服务地址

package com.frank.feignclient;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@FeignClient(
//服务名
name = "user-service",
//服务地址
url = "http://localhost:8081/api"
)
public interface UserFeignClient {

//对应的服务里的接口地址,及请求方式
@RequestMapping(value = "/getSuccessInfo", method = RequestMethod.GET)
@ResponseBody
String getSuccessInfo();

@RequestMapping(value = "/getFailInfo", method = RequestMethod.GET)
@ResponseBody
String getFailInfo();

/**
* 容错处理类,当调用失败时,简单返回空字符串
*/
@Component
class DefaultFallback implements UserFeignClient {
@Override
public String getSuccessInfo(){
return "getSuccessInfo serve is bad.";
}

@Override
public String getFailInfo() {
return "getFailInfo serve is bad.";
}
}
}

 

 

方式2:直接用controller层实现feign接口

@FeignClient(value = "ccb-platform-service")
@RequestMapping("homepage")
public interface AppHomePageFeignServiceI {
@ApiOperation("应用修改")
@PutMapping("/{appCode}")
@ApiImplicitParam(name = "appCode", value = "应用编码", required = true)
Response update(@PathVariable("appCode") String appCode, @RequestBody Homepages homepages);

@ApiOperation("获取主页信息")
@ApiImplicitParam(name = "appCode", value = "appCode", required = true)
@GetMapping("/{appCode}")
SingleResponse<Homepages> get(@PathVariable("appCode") String appCode);
}

@Api(tags = "设计时::应用主页管理")
@RestController
@Slf4j
@AllArgsConstructor
//@RequestMapping("homepage")
public class AppHomePageFeignController
implements AppHomePageFeignServiceI
{

private final AppHomePageServiceI appHomePageServiceI;


@Override
// @ApiOperation("应用修改")
// @PutMapping("/{appCode}")
// @ApiImplicitParam(name = "appCode", value = "应用编码", required = true)
public Response update(@PathVariable("appCode") String appCode,
@RequestBody Homepages homepages) {
AppHomePageUpdateCmd cmd = AppHomePageUpdateCmd.builder().appCode(appCode).homepages(homepages).build();
return appHomePageServiceI.update(cmd);
}

@Override
// @ApiOperation("获取主页信息")
// @ApiImplicitParam(name = "appCode", value = "appCode", required = true)
// @GetMapping("/{appCode}")
public SingleResponse<Homepages> get(@PathVariable("appCode") String appCode) {
AppHomePageQryCmd cmd = AppHomePageQryCmd.builder().appCode(appCode).build();
return appHomePageServiceI.get(cmd);
}
}

 

6.记录一种编码方式

 

@Component
public class MethodHandlerContainer {

@Autowired
private List<IMethodType> methodTypeList;//list中放的是实现了IMethodType的类对象

/**
* 获取对应的实现
*
* @param methodType 方法类型
* @return 结果
* @since 1.0.0
*/
public IMethodType getMethodType(final String methodType) {
for (IMethodType service : methodTypeList) {
GwMethodType route = service.getClass().getAnnotation(GwMethodType.class);
if (route != null) {
String value = route.value();

if (value.equals(methodType)) {
return service;
}
}
}

// 抛出异常
throw new GatewayServerException(GatewayServerRespCode.NOT_SUPPORT_METHOD_TYPE);
}

}

posted on 2022-03-04 10:59  云无形  阅读(51)  评论(0)    收藏  举报