SpringCloud-Feign

SpringCloud-Feign

官网手册:https://www.springcloud.cc/spring-cloud-dalston.html

Feign介绍

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

Feign的实现

先看一下服务提供者的Controller层

@RestControllerpublic class UserController {    @Autowired    private UserService userService;    @RequestMapping("/get")    public String getUser(){        return "123";    }    @RequestMapping("/getUsername")    public User getUserByName(@RequestParam("username") String username){        return userService.getUserByName(username);    }

}

消费端实现

然后编写消费者

Maven,需要导入Eureka和Feign的依赖

<!--Feign注解--><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--Eureka-Client依赖--><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

application.yml

server:  port: 8080eureka:  client:    register-with-eureka: false #不向Eureka注册自己    service-url:      defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/     #Eureka集群只需要用逗号分隔即可

定义一个接口,这里写在了service下

这里需要注意,该地方的请求路径必须对应上Eureka上的服务所提供的路径,说白了,就是这里的路径必须和服务提供者的controller层里的路径一致

@Component@FeignClient(value = "SPRINGCLOUD-PROVIDER-USER")  //Eureka上的服务注册名public interface UserClientService {    @RequestMapping("/get")    public String getUser();    @RequestMapping("/getUsername")    public User getUserByName(@RequestParam("username") String username);}

controller,这里的访问路径则可以不一致,这里也是我们最终要访问的路径

@RestControllerpublic class UserController {    //feign实现的话,这里就直接注入feign定义的那个接口就好了    @Autowired    private UserClientService userClientService = null;    @RequestMapping("/consumer/getUser")    public String getUser(){        return this.userClientService.getUser();    }    @RequestMapping("/consumer/getUsername")    public User getUserByName(@RequestParam("username") String username){        return this.userClientService.getUserByName(username);    }}

启动

@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublic class SpringcloudConsumerUserFeignApplication {    public static void main(String[] args) {        SpringApplication.run(SpringcloudConsumerUserFeignApplication.class, args);    }}

服务提供者的API中实现

上方Feign是在消费端实现的,然后我们在服务提供者的API上也实现一下

service里的内容其实还是一样的

@Component@FeignClient(value = "SPRINGCLOUD-PROVIDER-USER")public interface UserClientService {    @RequestMapping("/get")    public String getUser();    @RequestMapping("/getUsername")    public User getUserByName(@RequestParam("username") String username);}

只不过此时服务提供者的API需要导入Feign的依赖

<!--Feign注解--><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

消费端调用服务提供者的API即可

然后这时候的消费端就更加简洁了,此时的消费端只需要在Maven中导入服务提供者的API和Eureka即可,Feign依赖在服务提供者的API里存在了,所以这里不需要再进行导入

<!--服务提供者的API--><dependency>    <groupId>org.example</groupId>    <artifactId>springcloud-api</artifactId>    <version>1.0-SNAPSHOT</version></dependency><!--Eureka-Client依赖--><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

然后就是启动类有一点变化,这里Feign项需要指定到我们服务提供者API的路径

@SpringBootApplication@EnableEurekaClient@EnableFeignClients(basePackages = {"com.chen.springcloudapi"})  //写在消费端的话其实可以不用编写basePackagespublic class SpringcloudConsumerUserFeignApplication {    public static void main(String[] args) {        SpringApplication.run(SpringcloudConsumerUserFeignApplication.class, args);    }}

controller层无需改动,直接@Autowired即可使用

@RestControllerpublic class UserController {    //feign实现的话,这里就直接注入feign定义的哪个接口就好了    @Autowired    private UserClientService userClientService = null;    @RequestMapping("/consumer/getUser")    public String getUser(){        return this.userClientService.getUser();    }    @RequestMapping("/consumer/getUsername")    public User getUserByName(@RequestParam("username") String username){        return this.userClientService.getUserByName(username);    }}

application.yml文件也无需改动,Eureka该配置配置

server:  port: 8080eureka:  client:    register-with-eureka: false #不向Eureka注册自己    service-url:      defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/     #Eureka集群只需要用逗号分隔即可

至于Feign到底是写在消费端还是服务提供者API上,其实两者情况都有,但是写在服务提供者API上的话,多个消费端去调用时不需要重复编写Feigin。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部