发表于: 2018-01-08 16:02:22

1 896


今天完成的事

实现分布式。

比较牛逼的地方就是实现了共同调用接口。

如下


public interface StudentService {
@RequestMapping("StudentServicegetAll")
List<Student> getAll();
   @RequestMapping("StudentService")
Integer getStudy();
   @RequestMapping("StudentServicegetWork")
Integer getWork();

}

//@EnableAutoConfiguration
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class APP extends SpringBootServletInitializer {

public static void main(String[] args) {

SpringApplication.run(APP.class,args);

   }
}

这样就可以做到最方便的Feign调用





@FeignClient("pttengservice")
interface FeatureServiceC extends FeatureService{}

@FeignClient("pttengservice")
interface ProfessionServiceC extends ProfessionService{}

@FeignClient("pttengservice")
interface StudentServiceC extends StudentService{}

@FeignClient("pttengservice")
interface UserServiceC extends UserService{}


然后就会看到


完美匹配。



写接口文档

一、约定

1.查询多个的列表形式如id=2&id=3&id=4这种数据的形式。

2.如无特殊标注,所有的Post和Put操作都以Application/json 的方式提交,这样适合于复杂的模型。 一些简单的操作应注明    “application/x-www-form-urlencoded”

3.所有的返回字段都包含code和Message,code=0为正常,异常以 code为负表示,前端负责展示错误信息。

4.Rest风格

5./u/代表着是必须登录才可以访问的接口     如果不登录会报-6002错误

6.上传图片操作都以multipartFile的方式提交.

7.字段 第几页 page 不写时默认为1

8.字段 展示数量 size 不写时默认为10


 

前台字段约定:

前台所有接口中的status入参,如果没有特殊标注,全部为必填且值为1.

验证注册:

字段 用户账号状态  userStatus 0-冻结 1-正常 用户注册后默认为1

查询/更新用户详情: 

字段 类型 type 0-用户注册/登陆过程中调用接口 1-用户点击"我的"调用接口 2-用户点击"账户设置"调用接口

字段 实名状态 verification  0-未实名 1-已实名 用户注册后默认为0

字段 用户状态 userStatus0-冻结 1-正常

查询交易流水

字段  交易状态 tradeStatus 0-失败 1-成功

字段  交易类型 tradeType  0-还款 1-付款

查询用户消息

字段 消息类型 messageType  0-系统消息 1-公告消息

字段 系统消息类型 autoMessageType 0-投资成功 1-投资失败 2-即将到期 3-正在回款 4-回款成功 5-回款失败 6 续投成功 7 续投失败-1 不是系统消息

字段 发送人群recipient 0-单个用户 1-所有人 2-认证投资人  系统消息为0,公告消息为1或2

字段 类型 sendType 0-定时发送 1-即时发送

字段 同步推送 synchronization 0-否 1-是

字段 状态 messageStatus 0-草稿 1-上线

查询产品

字段 起息方式 chargingInterestWay 0-T+0  1-T+1  2-T+2

字段 角标 flag 0-最新 1-热门 2-普通

字段 精品推荐 recommended 0-所有产品(包括精品推荐) 1-精品推荐产品

字段 限购状态 limited 0-否 1-是

字段 还款方式 paymetBackWay 0-按月付息,到期还本 1-到期一次性还本付息

字段 产品状态  productStatus 0-草稿 1-上线

用户产品

字段 投资类型 investType 0-正常投资 1-续投产品

字段 投资状态 investStatus 0-已退出 1-退出中 2-投资中 3-已续投

查询内容

字段 内容类型  contentType  0-推荐banner图 1-帮助中心 2-关于我们

字段 内容状态  contentStatus 0-草稿 1-上线

查询合同

字段  合同类型  contractType  0-出借咨询与服务协议-新手计划 1-出借咨询与服务协议-按月付息产品 2-出借咨询与服务协议-到期一次性还本付息产品  3-出借确认和债权转让 - 授权委托书

  4-催收及诉讼 - 授权委托书  5-出借本金确认书  6-债权转让协议

字段  合同状态 contractStatus  0-用户查看产品合同模版  1-用户查看自己投资的产品的合同

查询回款计划

字段  回款状态 repaymentStatus  0-已还款  1-未还款

 

剩下的明天再写

收获

Feign的请求参数绑定机制

上述的SpringMVC参数绑定机制,大家应该都是非常熟悉的,但这一切在Feign中有些许的不同。
我们来看一个非常简单的,但是实际上错误的接口写法:
1
2
3
4
5
6
7
8
//注意:错误的接口写法
@FeignClient("book")
public interface BookApi {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String hello(String name);
}
配置请求地址:
1
2
3
4
5
6
7
ribbon:
eureka:
enabled: false
book:
ribbon:
listOfServers: http://localhost:8080
我们按照写SpringMVC的RestController的习惯写了一个FeignClient,按照我们的一开始的想法,由于指定了请求方式是GET,那么name应该会作为QueryString拼接到Url中吧?发出一个这样的GET请求:
1
2
GET /hello?name=xxx HTTP/1.1
Host: localhost:8080
而实际上,RestController并没有接收到,我们在RestController一侧的
  • 并没有按照期望使用GET方式发送请求,而是POST方式
  • name参数没有被封装,获得了一个null值
查看文档发现,如果不加默认的注解,Feign则会对参数默认加上@RequestBody注解,而RequestBody一定是包含在请求体中的,GET方式无法包含。所以上述两个现象得到了解释。Feign在GET请求包含RequestBody时强制转成了POST请求,而不是报错。
理解清楚了这个机制我们就可以在开发Feign接口避免很多坑。而解决上述这个问题也很简单
  • 在Feign接口中为name添加@RequestParam(“name”)注解,name必须指定,Feign的请求参数不会利用SpringMVC字节码的机制自动给定一个默认的名称。
  • 由于Feign默认使用@RequestBody,也可以改造RestController,使用@RequestBody接收。但是,请求参数通常是多个,推荐使用上述的@RequestParam,而@RequestBody一般只用于传递对象。

Feign绑定复合参数

指定请求参数的类型与请求方式,上述问题的出现实际上是由于在没有理清楚Feign内部机制的前提下想当然的和SpringMVC进行了类比。同样,在使用对象作为参数时,也需要注意这样的问题。
对于这样的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@FeignClient("book")
public interface BookApi {
@RequestMapping(value = "/book",method = RequestMethod.POST)
Book book(@RequestBody Book book); // <1>
@RequestMapping(value = "/book",method = RequestMethod.POST)
Book book(@RequestParam("id") String id,@RequestParam("name") String name); // <2>
@RequestMapping(value = "/book",method = RequestMethod.POST)
Book book(@RequestParam Map map); // <3>
//错误的写法
    @RequestMapping(value = "/book",method = RequestMethod.POST)
Book book(@RequestParam Book book); // <4>
}
<1> 使用@RequestBody传递对象是最常用的方式。
<2> 如果参数并不是很多,可以平铺开使用@RequestParam
<3> 使用Map,这也是完全可以的,但不太符合面向对象的思想,不能从代码立刻看出该接口需要什么样的参数。
<4> 错误的用法,Feign没有提供这样的机制自动转换实体为Map。



遇到的问题

第一个问题


代码重新写忘记绑定了。


第二个问题

怎样部署springboot为可执行jar
springboot 使用内嵌容器来提供服务,但是当我使用maven 打可执行jar时,其无法将静态文件(html/jsp)一并打入可执行文件
指定resource
<build>
    <resources>
        <resource>
            <directory>${basedir}/src/main/webapp</directory>
            <!--注意此次必须要放在此目录下才能被访问到-->
            <targetPath>META-INF/resources</targetPath>
            <includes>
                <include>**/**</include>
            </includes>
        </resource>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

第三个问题

Feign的超时

这个响应时间可能就大于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。该做法除非一些特殊场景,不推荐使用。

从Spring Cloud Edgware开始,Feign支持使用属性配置超时:

从Spring Cloud Edgware开始,Feign支持使用属性配置超时:

对于老版本,可以写个feign.Request.Options ,参考:org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration#feignRequestOptions 的写法即可。

明天要做的事

赶紧把接口文档写完

不能再脱了。。。


返回列表 返回列表
评论

    分享到