Spring Cloud开发注意事项

1、消费者和服务提供者(接口和实现)

service 接口上添加注解@FeignClient( name = "${feign.provider.portal}" ) feign.provider.portal 需要在application.yml中配置 portal provider 的application.name service实现类上需添加注解 @RestController , *Mapper.java 接口上需要添加 @Mapper

2、接口中的方法定义 需添加注解

@RequestMapping(value = "/${path}",method = RequestMethod.POST) , ${path}为请求路径,可以以方法名定义,method 如不确定请使用 POST,如果对象参数必须使用 POST,并且 参数前必须使用 @RequestBody 注解如果参数为基本数据类型或者String,可以使用GET方式,参数前需加@RequestParam注解,注解的value不能为空

@RequestMapping(value = "/save" , method = RequestMethod.POST) public int save(@RequestBody User user);

@RequestMapping(value = "/auditStaff",method = RequestMethod.POST) public void auditStaff(@RequestParam("staffId") String staffId, @RequestParam("deptId") String deptId);

  • 接口中使用的@RequestParam("value") ,在接口实现类中的参数名必须和注解中的value一致: 例如 接口方法 User find(@RequestParam("userId") String id) , 实现类方法 User find(String userId) ,如果不一致参数将为null。实际就是springMvc中的参数将RestApi中的请求参数绑定到方法的参数上
  • 如果接口中定义的参数有对象类型,需要在参数前添加 @RequestBody 注解,一个接口参数中仅能有一个@RequestBody 注解, 并且需要在 实现方法中 参数也添加 @RequestBody注解
  • 如果接口中参数未添加@RequestParam(@RequestHeader、@RequestBody),那么FeignClient默认使用POST发送请求,如果接口定义中定义的是method = RequestMethod.GET ,那么将报错,方法不匹配

3、跨feign client调用

如果provider中需要引入其他feign client的接口,需在 provider的启动类添加注解 @EnableFeignClients(basePackages = {"com.complay.biz.service"}) ,basePackages 为其他模块接口的包名

例如: 在portal provider中需要应用 mdata-service 中的接口,需要扫描 接口中的FeignClient 注解 使 mdata-service接口注入到接口,同时需要在application.yml 中配置依赖接口的feignClient 的name

4、Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题

Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了

解决方案有三种,以feign为例。

方法一hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000该配置是让Hystrix的超时时间改为5秒 方法二hystrix.command.default.execution.timeout.enabled: false该配置,用于禁用Hystrix的超时时间 方法三feign.hystrix.enabled: false该配置,用于索性禁用feign的hystrix。该做法除非一些特殊场景,不推荐使用。

5、http请求直接跳视图view:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/reserve/rsvquery/all").setViewName("/reserve/rsvquery/all");
registry.addViewController("/reserve/member/index").setViewName("/reserve/member/index");
}
}

6、debug关闭重试和超时:

feign.hystrix.enabled: false

7、config多级目录配置:

服务端svn 路径上配置一级目录: spring.cloud.config.server.svn.uri=svn://ip:port/repos/app-config/${server.code} 客户端将二级目录作为label配置 spring.cloud.config.label=portal

8、FeignClient Date类型参数有时差:

原因是Feign 客户端的将Date对象转为String,然后服务端接收的String转换为Date对象时采用的默认构造器的方式,new Date('Sat Sep 02 .....')

解决方法:1、当发送时间类型时,直接用String发送

2、Feign客户端实现FeignFormatterRegistrar接口自定义DateFormatRegister

@Component
public class DateFormatRegister implements FeignFormatterRegistrar{
public DateFormatRegister(){

}

@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addConverter(Date.class, String.class, new Date2StringConverter()); 
}
private class Date2StringConverter implements Converter<Date,String>{
@Override
public String convert(Date source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(source);
}

}
}

provider增加相应的解析器

@Configuration
public class WebConfigBeans {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
/**
* 增加字符串转日期的功能
*/
@PostConstruct
public void initEditableValidation() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter
.getWebBindingInitializer();
if (initializer.getConversionService() != null) {
GenericConversionService genericConversionService = (GenericConversionService) initializer
.getConversionService();
genericConversionService.addConverter(String.class, Date.class, new String2DateConverter());
}
}
}

9、Feign Rest请求参数过长 (角色选权限的时候,ID太多太长):

配置文件添加配置:server.maxHttpHeaderSize: 1024000 #单位byte,最大请求头数据大小,默认是8k

Properties类为ServerProperties,tomcat相关参数都在里面

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转JavaEE

Spring Cloud中Hystrix的请求缓存

高并发环境下如果能处理好缓存就可以有效的减小服务器的压力,Java中有许多非常好用的缓存工具,比如Redis、EHCache等,当然在Spring Cloud的...

3698
来自专栏青青天空树

spring基础(2:最小化XML配置)

  byType在出现多个匹配项时不会自动选择一个然是报错,为避免报错,有两种办法:1.使用<bean>元素的primary属性,设置为首选Bean,但所有be...

1062
来自专栏用户2442861的专栏

Python日志输出——logging模块

http://blog.csdn.net/chosen0ne/article/details/7319306

1611
来自专栏帅小子的日常

使用redis做缓存

8147
来自专栏Jerry的SAP技术分享

MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通...

1601
来自专栏老付的网络博客

SpringMVC 教程

   Spring 是目前比较流行的MVC框架,让POJO处理起来变的容易,也支持Rest的Url请求。采用松散的耦合可插拔的接口,比其它MVC接口更具有扩展...

1934
来自专栏java学习

Spring常用注解(收藏大全)

如果你是初学者,或者是自学者!你可以加小编微信(xxf960513)!小编可以给你学习上,工作上的一些建议以及可以给你(免费)提供学习资料!最重要我们还可以交个...

1052
来自专栏aoho求索

Spring Cloud Stream应用与自定义RocketMQ Binder:实现RocketMQ绑定器

前言: 本文作者张天,节选自笔者与其合著的《Spring Cloud微服务架构进阶》,即将在八月出版问世。本文将其中Spring Cloud Stream应用与...

3373
来自专栏王二麻子IT技术交流园地

《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

到目前为止我们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并可以自己写一个配置方式开发的小Demo了。今天我们来...

1822
来自专栏Java技术栈

Java 必须掌握的 12 种 Spring 常用注解!

@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)

1642

扫码关注云+社区

领取腾讯云代金券