ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
将feign脱离微服务,作为一个类似于RestTemplate和httpclient的http请求工具,但是不需要配置 ## 1. maven依赖 ~~~ <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-core</artifactId> <version>8.18.0</version> </dependency> ~~~ ## 2. 自定义接口 client端口接口中写出server的地址、请求参数 ~~~ import feign.Param; import feign.RequestLine; public interface RemoteService { @RequestLine("GET /users/list?name={name}") String getOwner(@Param(value = "name") String name); } ~~~ 通过`@RequestLine`指定HTTP协议及URL地址 ## 3. 配置类 ~~~ RemoteService service = Feign.builder() .options(new Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)) .target(RemoteService.class, "http://127.0.0.1:8085"); ~~~ 1. options方法指定连接超时时长及响应超时时长, 2. retryer方法指定重试策略 3. target方法绑定要调用接口类与服务端地址 4. 调用返回结果类型为绑定的接口类型,对象类型就按照键名配置 ## 调用 使用配置类(包含接口信息) ~~~ String result = service.getOwner("scott"); ~~~ 与调用本地方法相同的方式调用feign包装的接口,直接获取远程服务提供的返回值。 #### 附:服务生产者 ~~~ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value="users") public class UserController { @RequestMapping(value="/list",method={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT}) @ResponseBody public String list(@RequestParam String name) throws InterruptedException{ return name.toUpperCase(); } } ~~~ ## 更进一步 在项目中,服务消费端与生产端之间交换的数据往往是一或多个对象,feign同样提供基于json的对象转换工具,方便我们直接以对象形式交互。 ### 业务接口 ~~~kotlin public interface RemoteService { @Headers({"Content-Type: application/json","Accept: application/json"}) @RequestLine("POST /users/list") User getOwner(User user); } ~~~ 加入@Headers注解,指定Content-Type为json ### 配置 ~~~cpp RemoteService service = Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .options(new Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)) .target(RemoteService.class, "http://127.0.0.1:8085"); ~~~ encoder指定对象编码方式,decoder指定对象解码方式。这里用的是基于Jackson的编、解码方式,需要在pom.xml中添加Jackson的依赖 ~~~xml <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-jackson</artifactId> <version>8.18.0</version> </dependency> ~~~ ### 调用 ~~~undefined User result = service.getOwner(u); ~~~ #### 附:服务生产者 ~~~css @Controller @RequestMapping(value="users") public class UserController { @RequestMapping(value="/list",method={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT}) @ResponseBody public User list(@RequestBody User user) throws InterruptedException{ System.out.println(user.getUsername()); user.setId(100L); user.setUsername(user.getUsername().toUpperCase()); return user; } } ~~~