AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
下面来将前面的例子用 Feign 改写,让其达到与 Ribbon + RestTemplate 相同的效果。 * 创建一个 Maven 项目 microservice-consumer-movie-feign ~~~bash mvn archetype:generate -DgroupId=com.shiyanlou -DartifactId=microservice-consumer-movie-feign -DarchetypeArtifactId=maven-archetype-quickstart ~~~ * 复制实验四中的项目`microservice-consumer-movie`中的内容 ,将`ArtifactId`修改为`microservice-consumer-movie-feign`。 * 在 pom.xml 中添加依赖: ~~~xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ~~~ * 修改`App.java`加注解:启动类上添加`@EnableFeignClients`。 ~~~java package com.shiyanlou; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } ~~~ * 编写 Feign Client,`UserFeignClient.java`: ~~~java package com.shiyanlou; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import com.shiyanlou.User; @FeignClient(name = "microservice-provider-user") public interface UserFeignClient { @GetMapping("/users/{id}") User findById(@PathVariable("id") Long id); } ~~~ 这样一个 Feign Client 就写完啦!其中,`@FeignClient`注解中的`microservice-provider-user`是想要请求服务的名称,**这是用来创建 Ribbon Client 的(Feign 整合了 Ribbon)**。在本例中,由于使用了 Eureka,所以 Ribbon 会把`microservice-provider-user`解析成 Eureka Server 中的服务。除此之外,还可使用 url 属性指定请求的 URL(URL 可以是完整的 URL 或主机名),例如`@FeignClient(name = "abcde", url = "http://localhost:8000/")`。**此外,name 可以是任意值,但不可省略,否则应用将无法启动**! * Controller: ~~~java package com.shiyanlou; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/movies") @RestController public class MovieController { @Autowired private UserFeignClient userFeignClient; @GetMapping("/users/{id}") public User findById(@PathVariable Long id) { return this.userFeignClient.findById(id); } } ~~~ 只需使用 @Autowire 注解,即可注入上面编写的 Feign Client。 * 最终结构: ![](https://img.kancloud.cn/0d/6d/0d6df491015f9bd7e2eb2ef0d5dbec09_395x330.png)