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层

@RestController
public 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: 8080

eureka:
  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,这里的访问路径则可以不一致,这里也是我们最终要访问的路径

@RestController
public 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
@EnableFeignClients
public 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"})  
public class SpringcloudConsumerUserFeignApplication {

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

}

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

@RestController
public 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: 8080

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

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

 

posted @ 2022-05-19 15:00  RFAA  阅读(62)  评论(0编辑  收藏  举报