springcloud实战落地填坑
2018.06.14
sherryriver
流水账技术
 pv:
如果看过之前我写的博客的应该知道,早在16年的时候就关注了sc这一股新力量,当时只是私下时间关注。
到了新的一年sc发展迅猛,幸运的是目前新公司一个新项目要采用sc架构,正好有机会参与。
记录下当时项目实战落地解决一些坑
1、Feign支持上传而且接口又支持表单模式提交
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.2.2</version> </dependency>
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.2.2</version> </dependency>
@SpringBootApplication @EnableFeignClients public class AdminAppBootstrap {
@Autowired private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); } }
|
2、解决Feign首次请求失败问题
3、zuul网关默认过滤header部分内容的问题
问题描述:
zuul网关默认过滤header中的敏感信息 Cookie,Set-Cookie,Authorization,也就是说不会将这些信息传到底层的微服务中,
由于我们的部分服务需要Authorization中的token信息,如果不更改默认配置,会导致下层服务中token获取不到。
解决方式:
我们可以在配置文件中修改配置
例如:只拦截 Cookie,Set-Cookie
zuul:
sensitive-headers: Cookie,Set-Cookie
4、Feign性能测试
直接调业务接口在500的并发情况下,响应平均是300ms。经过cloud的转发,响应很多错误,发现是hystrix的线程限制原因,为了测试,简单粗暴的把hystrix功能关掉:feign.hystrix.enabled: false。测试的平均响应打到800+ms。依然是一个不能接收的结果
<dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-okhttp</artifactId> <version>RELEASE</version> </dependency>
|
后续测试,平均响应在450ms左右
5、Feign Client开启日志
@FeignClient(name = “SERVICE-PRODUCT”, path = “/v1/product”,configuration = ProductServiceConfig.class)
注解类的代码如下:
@Configuration public class ProductServiceConfig {
@Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
|
6、版本需求
版本为微服务级别,也就是说不存在一个API是v3版,其他API还只是v1版的问题,要升级所有API版本一起升级,但是需要保证之前版本v1-v3还可以使用。
原则上要兼容上一个版本 如果当前是 /v3 则 /v2 要求可以正常使用 /v1 不做要求
解决方法:
swagger注解就可以实现上述要求
@ApiOperation("分页查询") @RequestMapping(value = "/v1/pb/product", method = RequestMethod.GET) @Deprecated List<Product> selectAll(@RequestParam("offset") Integer offset, @RequestParam("limit") Integer limit);
@ApiOperation("带过滤条件和排序的分页查询") @RequestMapping(value = "/{version}/pb/product", method = RequestMethod.GET) @ApiImplicitParam(name = "version", paramType = "path", allowableValues = ProviderApiAutoConfig.CURRENT_VERSION, required = true) Resp<PageData<Product>> selectAllGet(Page page);
@ApiOperation(value = "带过滤条件和排序的复杂分页查询") @ApiImplicitParam(name = "version", paramType = "path", allowableValues = ProviderApiAutoConfig.COMPATIBLE_VERSION, required = true) @RequestMapping(value = "/{version}/pb/product/action/search", method = RequestMethod.POST) Resp<PageData<Product>> selectAll(@RequestBody Page page);
|