restTemplate实现跨服务API调用方式
作者:GoodStudyAndDayDayUp
这篇文章主要介绍了restTemplate实现跨服务API调用方式,具有很好的参考价值,希望对大家有所帮助。
restTemplate跨服务API调用
同时使用ribbon,实现接口调用的负载均衡。
1 注册中心
略…
2 消费端
2.1 pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2.2 application.properties
spring.application.name=ribbon-consumer server.port=9000 # 本地启动注册中心 eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
2.3 启动类
package com.example.lei; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient @SpringBootApplication public class RibbonConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }
2.4 消费
package com.example.lei.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @Author: leimin * @Description: new class * @Date: 2020/6/8 16:04 * @Version: 1.0 */ @RestController public class ConsumerController { /** * xx */ @Autowired RestTemplate restTemplate; /** * yyy * @return rr */ @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET) private String helloConsumer(){ return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody(); } }
3 服务端
3.1 pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
3.2 application.properties
spring.application.name=hello-service # 服务注册到两台注册中心 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka
3.3 启动类
package com.didispace.springboothello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 能够被发现为客户端 */ @EnableDiscoveryClient @SpringBootApplication public class SpringBootHelloApplication { public static void main(String[] args) { SpringApplication.run(SpringBootHelloApplication.class, args); } }
3.4 服务
package com.didispace.springboothello.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.logging.Logger; /** * @Author: leimin * @Description: new class * @Date: 2020/6/8 9:08 * @Version: 1.0 */ @RestController public class HelloController { /** * xx */ private final Logger logger = Logger.getLogger(String.valueOf(getClass())); /** * xx */ @Autowired private DiscoveryClient client; /** * xx * @return xx */ @RequestMapping(value = "/hello",method = RequestMethod.GET) public String index(){ ServiceInstance instance = client.getLocalServiceInstance(); logger.info("/hello,host:" + instance.getHost()+", service_id:" +instance.getServiceId()); return "hello World !"; } }
restTemplate实现跨域调用接口
本文主要针对post方式,发送请求。
import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * 调用mufly_api接口 * Created by 耿洪生 on 2016/10/17. */ @Component public class HttpEntityServiceImpl { @Value("${muflyapi.appid}") private String appID; public ResponseEntity<String> responseHttpEntity(String url, Object parameters) { Map<String, Object> requestObject = new HashMap<>(); requestObject.put("appID", appID); requestObject.put("parameters", parameters); //转json字符串 JSONObject jsonObject = (JSONObject) JSONObject.toJSON(requestObject); String jsonStr = jsonObject.toJSONString(); //设置HttpHeader HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "application/json;charset=UTF-8"); //设置HttpEntity HttpEntity<String> entity = new HttpEntity<String>(jsonStr, headers); //设置连接、读取超时时间 SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(30 * 1000); factory.setReadTimeout(60 * 1000); //接口调用 RestTemplate temp = new RestTemplate(factory); ResponseEntity<String> output = temp.postForEntity(url, entity, String.class); return output; } }
如果,你不想new,可以使用@Autowired直接引入:
@Autowired private RestTemplate restTemplate;
/** * post请求 * * @param url * @param data map类型 * @param token * @return 实体 */ public ResponseEntity<String> post(String url, Map data, String token) { HttpHeaders headers = new HttpHeaders(); headers.add("Accept", "application/json"); headers.add("Accept-Encoding", "gzip"); headers.add("Content-Encoding", "UTF-8"); headers.add("Content-Type", "application/json;charset=UTF-8"); headers.add("Token", token); String dataStr = JsonUtil.toJSon(data); HttpEntity<String> postEntity = new HttpEntity<>(dataStr, headers); return restTemplate.postForEntity(url, postEntity, String.class); }
至于设置restTemplate bean 的超时:
@Bean(name="restTemplate") RestTemplate restTemplate() { ClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); //设置连接、读取超时时间 ((SimpleClientHttpRequestFactory) factory).setConnectTimeout(30 * 1000); ((SimpleClientHttpRequestFactory) factory).setReadTimeout(60 * 1000); return new RestTemplate(); }
spring自带的restTemplate里有很多实用的方法,
其底层还是ClientHttpRequest,
总结
以此记录。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。