SpringCloud-02:通过RestTemplate、OpenFeign发起远程服务掉用

通过RestTemplate、OpenFeign发起远程服务掉用

上一节,介绍了Eureka集群的搭建,以及单个微服务如何向Eureka进行注册。这一节,简单介绍如何在一个服务中,调用另外一个服务(实质是发Http请求)。

几个概念

RestTemplate是Spring提供的对Http客户端的封装类,能够发起Http调用并解析Http响应,比Httpclient使用起来更方便。

Feign基于RestTemplate进行了更进一步的包装,并且实现了声明式的接口调用——内部实现是,读取接口中的信息,自动组装请求的url和参数,发起http调用,解析http响应,然后将调用结果返回给调用者。

OpenFeign则是将Feign实现的功能,纳入SpringMVC注解的管理范畴,能够和SpringBoot进行无缝集成。

OpenFeign发起调用的步骤

  1. 新建一个SpringWeb项目(带Eureka),作为服务提供方,提供一个http接口,如sayHello()。

    application.name叫test-provider

@RestController
public class MainController {

    @Value("${server.port}")
    String port;

    @GetMapping("/sayHello")
    public String sayHello() {
        return "Hi, port="+port;
    }
}

启动该服务作为服务提供方。最好是在两个不同的端口,如9001和9002上分别启动,以便于观察服务消费方,OpenFeign(默认集成了Ribbon)提供的负载均衡功能。

  1. 服务消费方(也是带Eureka的Web项目)的pom.xml中引入openfeign依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
    
  2. 在服务消费方的启动类@SpringBootApplication上加注解@EnableFeignClients

  3. 服务消费方,写好接口:

    //ITestApi.java
    public interface ITestApi {
        @GetMapping("/sayHello")
        public String sayHello();
    }
    
    //TestApi.java
    //指定服务提供方的application-name
    @FeignClient(name = "test-provider")
    public interface TestApi extends ITestApi {
    }
    
  4. 消费方发起调用,比如在Controller里面:

    @Autowired
    TestApi testApi;
    
    @GetMapping("/getByFeign")
    public String getByFeign() {
        return testApi.sayHello();
    }
    

    然后,通过浏览器访问服务消费方提供的Http接口:

    http://localhost:8081/getByFeign

    在页面上得到服务提供方返回的信息:

    Hi, port=9001

    Hi, port=9002

    交替出现9001和9002,说明OpenFeign集成的负载均衡策略起作用了。

RestTemplate发起远程调用

在服务消费方@SpringBootApplication服务启动类里面,注册一个单例RestTemplate:

@Bean
@LoadBalanced// 开启负载均衡
RestTemplate restTemplate() {
    return new RestTemplate();
}

在Controller里面直接通过restTemplate向服务提供方发起调用。

@Autowired
RestTemplate restTemplate;

@GetMapping("/getRest")
public String getRestTemplate() {
    String url = "http://test-provider/sayHello";
    String res = restTemplate.getForObject(url, String.class);
    return res;
}

或者注入LoadBalancerClient lb,通过lb.choose(service-name)完成负载均衡。

@Autowired
LoadBalancerClient lb;

@GetMapping("/getLB")
public Object getLB() {
    //ribbon完成客户端的负载均衡,过滤掉了down掉的节点
    ServiceInstance ins = lb.choose("test-provider");
    String url = "http://"+ins.getHost()+":"+ins.getPort()+"/sayHello";
    System.out.println("url:"+url);
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.getForObject(url, String.class);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值