版权声明:转发请注明链接和出处,靴靴 https://blog.csdn.net/weixin_43525116/article/details/84954002
配置与实现调用
注:本次实现调用restful接口时,入参和出参都是一个类,使用post请求方式,这里有 RestTemplate的几种请求方式.(GET,POST,DELETE,PUT)
本项目所在项目A,与提供restful接口的,被调用的项目B,必须在同一个环境的Eureka上注册,才能调用到。(一个大项目会有好几个环境dev,test等)
例:一个SpringBoot项目的test环境的Eureka配置(项目发布到test环境之后自动注册,启动本地服务之后,Eureka服务列表里也可以看到你的本地机器名):
application-test.yml
Maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 这里使用版本变量,可根据项目需要自行设定合适的版本 -->
<version>${spring.boot.version}</version>
</dependency>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
(注意:一定要记得导入调用restful接口所在项目B的jar包噢!!)
注册与使用RestTemplate
方法一:
applicationContext-mvc.xml 里注册 RestTemplate
<!-- 配置RestTemplate -->
<!--Http client Factory -->
<bean id="httpClientFactory"
class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="10000" />
<property name="readTimeout" value="10000" />
</bean>
<!--RestTemplate -->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpClientFactory" />
</bean>
@Controller:
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
/**
* 测试restful接口调用
*/
@RequestMapping(value = "getTest", method = RequestMethod.GET)
@ResponseBody
public PackScanRecVo getTest() {
// 入参数据添加
ScanArrSo so = new ScanArrSo();
Long siteId = 3068L;
Date from = DateUtil.setTimeToTheStartOfTheDay(new Date());
Date to = DateUtil.setTimeToTheEndOfTheDay(new Date());
so.setScanSiteId(siteId);
so.setScanDateFrom(from);
so.setScanDateTo(to);
// 利用Ribbon的组件 LoadBalancerClient,拼接动态服务地址
// 因为Eureka上的服务地址是会变的,根据服务ID来获取IP和端口,再拼接
ServiceInstance serviceInstance = loadBalancerClient.choose("服务ID");
String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort()
+ "/应用名/接口url";
System.out.println(url);
ResponseEntity<PackScanRecVo> responseEntity = restTemplate.postForEntity(url, so, PackScanRecVo.class);
return responseEntity.getBody();
}
方法二:
在项目启动类 WebApplication.java 里注册 RestTemplate
注意添加注解:
@EnableEurekaClient
@EnableFeignClients
@Bean
@LoadBalanced
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@ImportResource(locations = { "classpath:spring/applicationContext-*.xml" })
@ComponentScan(nameGenerator = xx.xx.xx.util.spring.MyBeanNameGenerator.class)
@EnableDiscoveryClient
public class WebApplication {
private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);
public static void main(String[] args) throws Exception {
SpringApplication.run(WebApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Controller:
@Autowired
private RestTemplate restTemplate;
/**
* 测试restful接口调用
*/
@RequestMapping(value = "getTest", method = RequestMethod.GET)
@ResponseBody
public PackScanRecVo getTest() {
// 入参数据添加
ScanArrSo so = new ScanArrSo();
Long siteId = 3068L;
Date from = DateUtil.setTimeToTheStartOfTheDay(new Date());
Date to = DateUtil.setTimeToTheEndOfTheDay(new Date());
so.setScanSiteId(siteId);
so.setScanDateFrom(from);
so.setScanDateTo(to);
// Ribbon根据服务名找到对应IP和端口
String url = "http://服务名/应用名/接口url";
ResponseEntity<PackScanRecVo> responseEntity = restTemplate.postForEntity(url, so, PackScanRecVo.class);
return responseEntity.getBody();
}
遇坑
-
刚开始将上述两种注册方式都实现了,导致方法二的实现方式失效,只能使用方法一的负载均衡类拼接动态IP方式找到系统B的服务接口,所以
1). RestTemplate 只能注册一次;
2). 所以两种方法的配置和实现是对应的,不能串用; -
问清楚项目B接口是什么请求方式,使用对应的RestTemplate请求方法;请求方式错误会报405错;