通过RestTemplate、OpenFeign发起远程服务掉用
文章目录
- 通过RestTemplate、OpenFeign发起远程服务掉用
- 几个概念
- OpenFeign发起调用的步骤
- RestTemplate发起远程调用
上一节,介绍了Eureka集群的搭建,以及单个微服务如何向Eureka进行注册。这一节,简单介绍如何在一个服务中,调用另外一个服务(实质是发Http请求)。
几个概念
RestTemplate是Spring提供的对Http客户端的封装类,能够发起Http调用并解析Http响应,比Httpclient使用起来更方便。
Feign基于RestTemplate进行了更进一步的包装,并且实现了声明式的接口调用——内部实现是,读取接口中的信息,自动组装请求的url和参数,发起http调用,解析http响应,然后将调用结果返回给调用者。
OpenFeign则是将Feign实现的功能,纳入SpringMVC注解的管理范畴,能够和SpringBoot进行无缝集成。
OpenFeign发起调用的步骤
-
新建一个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)提供的负载均衡功能。
-
服务消费方(也是带Eureka的Web项目)的pom.xml中引入openfeign
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
-
在服务消费方的启动类@SpringBootApplication上加注解@EnableFeignClients
。
-
服务消费方,写好接口:
public interface ITestApi {
@GetMapping("/sayHello")
public String sayHello();
}
@FeignClient(name = "test-provider")
public interface TestApi extends ITestApi {
}
-
消费方发起调用,比如在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() {
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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)