spring cloud (二)

1、使用Feign实现远程HTTP调用

基于spring cloud (一),使用Feign可以解决一下问题:

 

1)添加pom依赖

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

 

2)启动类添加注解

 

3)创建包、接口

 

 UserCenterFeignClient

@FeignClient(name = "user-center") //name属性的值为服务提供者名称
public interface UserCenterFeignClient {

    /**
     * 作用:自动转换成 http://user-center/user?id=xx
     * @param id
     * @return  com.nicechen.util.ResultUtil
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/findbyid")
    ResultUtil findById(@RequestParam("id") Integer id);
}

 

修改 /finduser 接口

    @Autowired
    private UserCenterFeignClient feignClient;


    @GetMapping("/finduser")
    public ResultUtil findUser(Integer id){
        /*ResultUtil forObject = restTemplate.getForObject("http://user-center/user/findbyid?id={id}",
                ResultUtil.class,2);*/
        
        return feignClient.findById(id);
    }

 

1.1、Feign的组成

 

 

1.2、细粒度配置自定义

feign的自定义配置也有两种方式:

  1. java代码方式
  2. 配置属性方式

 

 

1.2.1、java代码方式

Feign默认不打印日志

1) 创建FeignConfig

//由于父子上下文,如果要加configuration注解,就要把这个类放在启动类所在包外
//@Configuration
public class FeignConfig {
    @Bean
    public Logger.Level level() {
        //让 Feign打印所有请求的细节
        return Logger.Level.FULL;
    }
}

 

 

2)回到UserCenterFeignClient接口,修改注解即可

//指定这个接口是FeignClient
@FeignClient(name = "user-center",configuration = FeignConfig.class)
public interface UserCenterFeignClient {

    /**
     * 作用:自动转换成 http://user-center/user?id=xx
     * @param id
     * @return  com.nicechen.util.ResultUtil
     */
    @RequestMapping(method = RequestMethod.GET, value = "/user/findbyid")
    ResultUtil findById(@RequestParam("id") Integer id);
}

 

 

3)添加配置文件

logging:
  level:
    #UserCenterFeignClient的全路径,值必须为DEBUG
    com.nicechen.feignclient.UserCenterFeignClient: DEBUG

 

 

1.2.2、配置属性方式

1)注释掉1.2.1添加的代码

 

2)配置文件添加配置:

logging:
  level:
     #UserCenterFeignClient的全路径,值必须为DEBUG
    com.nicechen.feignclient.UserCenterFeignClient: DEBUG
feign:
  client:
    config:
      #想要调用的微服务的名称
      user-center:
        loggerLevel: full

 

 

1.2.3、全局配置

1)注释掉1.2.1以及1.2.2代码,解开FeignConfig注释(如果被注释了)

 

2)配置文件添加配置:

logging:
  level:
     #UserCenterFeignClient的全路径,值必须为DEBUG
    com.nicechen.feignclient.UserCenterFeignClient: DEBUG

 

 

3)启动类修改注解

@EnableFeignClients(defaultConfiguration = FeignConfig.class)

 

1.3、Feign的配置项

配置文件:

 

 

1.4、Feign代码方式 vs 属性方式

 

 

2、添加查询、添加数据接口

1)前往user-center添加两个接口

    @GetMapping("/findbyidwxid")
    public ResultUtil findByIdwxId(Integer id, Integer wxId) {
        return service.findByIdwxId(id, wxId);
    }

    @PostMapping("/insert")
    public ResultUtil insert(@RequestBody User user) {
        return service.insert(user);
    }

 

 

2)前往centent-center添加Feign接口

@FeignClient(name = "user-center")
public interface TestUserFeign {

    @GetMapping("/user/findbyidwxid")
  //多个参数也可以使用 @SpringQueryMap注解,就不需要写多个 @RequestParam注解来一个一个映射 ResultUtil findByIdwxId(@RequestParam(
"id") Integer id, @RequestParam("wxId") Integer wxId); @PostMapping("/user/insert") ResultUtil insert(@RequestBody User user); }

 

 

3)配置文件添加配置,否则新建的Feign接口(TestUSerFeign)不生效,因为默认仅支持一个Fegin接口

  #允许多个Feign接口
  main:
    allow-bean-definition-overriding: true

 

 

4)添加调用服务接口

    @Autowired //这里有个坑,使用@Resource不行
    private TestUserFeign userFeign;    


    @GetMapping("/findbyidwxid")
    public ResultUtil findByIdwxId(Integer id,Integer wxId){
        log.info("{}-----{}",id,wxId);
        return userFeign.findByIdwxId(id,wxId);
    }


    @PostMapping("/insert")
    public ResultUtil insert(@RequestBody User user) {
        return userFeign.insert(user);
    }

 

 

5)测试。

 

3、 Feign脱离Ribbon使用

场景:想要调用为注册进入Nacos的服务。

案例:调用百度。

1)添加Feign接口

//没有该服务,name可以自定义,但是要添加url
@FeignClient(name = "baidu", url = "www.baidu.com") public interface TestBaiduFrign { @GetMapping("") String index(); }

 

 

2)添加调用百度接口

    @Autowired
    private TestBaiduFrign baiduFrign;

    @GetMapping("/baidu")
    public String baidu() {
        return baiduFrign.index();
    }

 

 

3)测试调用接口 /baidu。

 

4、RestTemplate vs Feign

 

5、Feign性能优化

5.1、配置连接池

1)添加pom依赖

<dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
</dependency>

 

 

2)配置文件添加配置

feign:
  client:
    config:
      #想要调用的微服务的名称
      user-center:
        loggerLevel: full
  httpclient:
    #让feign使用阿帕奇 httpclient做请求,而不是默认的urlconnection
    enabled: true
    #feign的最大连接数
    max-connections: 200
    #单个接口最大访问数
    max-connections-per-route: 50

 

5、常见问题

Feign常见问题总结_慕课手记 (imooc.com)

 

posted @ 2021-11-13 14:19  nicechen  阅读(36)  评论(0编辑  收藏  举报