调用接口的几种方式:RestTemplate和feign

RestTemplate:

先在一个项目的controller中写入一个接口:
调用接口的几种方式:RestTemplate和feign_第1张图片
他的应用名字为server:

spring:
  application:
    name: server

但其实打开eureka看到的是SERVER大写的。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

开启第二个项目:来调用第一个项目中的接口
第一种方式:直接调用

       RestTemplate restTemplate=new RestTemplate();
        String msg=restTemplate.getForObject("http://localhost:8080/server/msg",String.class);
       log.info("msg:{}",msg);

第二种方式:采用LoadBalanceClient。
如果对方开多个项目一,搞了个集群,那么用LoadBalanceClient,是客户端默认采用轮询的方式,给你选出一个,进行调用。这里的意思是,给我这个应用的名字,如果开了多个这个应用(这里指的是SERVER应用,也就是指我的项目一),那么它选出一个给我。我用getHost和getPort就可以知道它给我的是哪个,然后用RestTemplate调用。

        ServiceInstance serviceInstance=loadBalancerClient.choose("SERVER");
      String url= String.format("http://%s:%s/server/msg",serviceInstance.getHost(),serviceInstance.getPort());
        RestTemplate restTemplate=new RestTemplate();
        String msg=restTemplate.getForObject(url,String.class);
        log.info("msg:{}",msg);

第三种方式:对第二种方式的简单处理:
这里是把RestTemplate 进行加工后,再给spring处理:
调用接口的几种方式:RestTemplate和feign_第2张图片
于是在controller中调用即可:
先注入restTemplate

@Resource
    private RestTemplate restTemplate;

然后调用:

        String msg=restTemplate.getForObject("http://SERVER/server/msg",String.class);
        log.info("msg:{}",msg);

host和port直接变成application name即可(SERVER):
在这里插入图片描述
简单说下@Bean注解和@Resource
调用接口的几种方式:RestTemplate和feign_第3张图片

而@Resource注入的时候看的是名字,是属性的名字,而不是看类
这里:我是把它当成bean交给了spring:
调用接口的几种方式:RestTemplate和feign_第4张图片
所以我在这里定义成员属性的时候就必须写一样的名字:在这里插入图片描述

feign:

依赖:这里很坑,要看版本,我这里是新的,如果用了旧的maven会报红、这里有升级后的依赖:很全:[升级后的依赖],(https://zhuanlan.zhihu.com/p/111927645)

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动类加注解:@EnableFeignClients

写个接口类调用api:(这里有个坑!!不要把接口类的名字设置为FeignClient,因为这个与本身的FeignClient重名了,会导致错误!!)

@FeignClient(name = "server")
public interface Client  {
    @GetMapping("/server/msg")
  String msg();
    @GetMapping("/server/category")
    List<ProductCategory> category();

}

@FeignClient(name = “server”)是指定application name,项目一设置的就是sever。
再后面就是项目一配置的controller中的@RequestMapping了。
然后在controller中把刚刚写的interface注入:
调用接口的几种方式:RestTemplate和feign_第5张图片
用feign调用接口调用接口的几种方式:RestTemplate和feign_第6张图片

你可能感兴趣的:(SpringCloud,spring,boot)