导航
导航

springcloud实战落地填坑

如果看过之前我写的博客的应该知道,早在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;

/**
* Feign支持上传而且接口又支持表单模式提交
*/
@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 {

/**
*
* Logger.Level 的具体级别如下:
NONE:不记录任何信息
BASIC:仅记录请求方法、URL以及响应状态码和执行时间
HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据
*/
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

6、版本需求
版本为微服务级别,也就是说不存在一个API是v3版,其他API还只是v1版的问题,要升级所有API版本一起升级,但是需要保证之前版本v1-v3还可以使用。
原则上要兼容上一个版本 如果当前是 /v3 则 /v2 要求可以正常使用 /v1 不做要求

解决方法:
swagger注解就可以实现上述要求


// v1版api 即将废弃
@ApiOperation("分页查询")
@RequestMapping(value = "/v1/pb/product", method = RequestMethod.GET)
@Deprecated
List<Product> selectAll(@RequestParam("offset") Integer offset, @RequestParam("limit") Integer limit);

//ProviderApiAutoConfig.CURRENT_VERSION="v2" 用来替换上面的v1版本
@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);

// ProviderApiAutoConfig.COMPATIBLE_VERSION="v2,v1" swagger-ui上会显示一个version的下拉框, 默认v2
@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);