RestTemplate的三种使用方式
生活随笔
收集整理的這篇文章主要介紹了
RestTemplate的三种使用方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RestTemplate是一個HTTP客戶端,相信大家在HTTP Client里面都有用過HTTP Client,RestTemplate和他功能差不多,用法上他更加的簡單,我們使用訂單服務區調用商品服務的接口,查詢商品的信息,需要調用商品的服務,在訂單服務里面去調用商品服務,我們現在調用先不要做得那么復雜,不要一上來就調用商品的信息,我們可以把商品服務理解為Service端,我們來寫一些簡單的方法localhost:8080/msglocalhost:8081/getProductMsg這樣就實現了服務間的通信,那我們來看一下這種方式有什么缺點,其實很大的缺點呢,就是這個URL他固定寫死的,這個地址你必須給他寫死,到時候線上的時候你部署多臺服務器,你甚至連部署的IP你都是不知道的,這樣子訪問肯定是不行的,不知道對方的IP,這是第一種情況,所以這種方式是不好的,那還有另外一種情況呢,是對方可能有多個地址,對方可能有多個實例,比如我現在可能啟動兩個product應用,這個時候就有負載均衡的概念了,對方的服務有兩臺,那我希望的結果就是訪問其中任意一臺就好了,給我返回一個結果,所以說在有多個地址的時候呢,對于這種使用方法,又是一個大考驗,所以我們用另外一種方式,我們有第二種方式,SpringCloud里面提供了LoadBalance@Autowired
private LoadBalancerClient loadBalancerClient;org.springframework.cloud.client.loadbalancer.LoadBalancerClient我們不是要取地址嗎,那我們通過這種方式,把地址給他拿到就好了,第二種方式格式化獲取還是挺累的,有沒有更簡單的方法呢,第一種是RestTemplate url直接寫死@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}這樣子寫和之前寫差別不太大的,關鍵是什么呢,關鍵是你這里還要加一個注解@LoadBalanced,其實第三種方式無非是用了@LoadBalanced注解,第二種方式是Autowired,第三種是使用注解的方式來用,這里有一個負載均衡的問題,負載策略可以隨機可以輪詢
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>product</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>cn.learn</groupId><artifactId>microcloud02</artifactId><version>0.0.1</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version><thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version></properties><dependencies><dependency><!-- 引入web模塊 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot進行單元測試的模塊 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 引入druid數據源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><!-- 這個插件,可以將應用打包成一個可執行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
#debug=true
server.port=8080#server.context-path=/boot02spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=truelogging.level.com.learn=trace
#logging.file=D:/springboot.log
logging.file=springboot.log
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n
#spring.resources.static-locations=classpath:/hello,classpath:/learnspring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://59.110.158.145:3306/SpringCloud?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xmleureka.client.serviceUrl.defaultZone=http://admin:1234@10.40.8.152:8761/eurekaspring.application.name=product
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
#eureka.client.healthcheck.enabled=true#eureka.instance.appname=microservice-simple-provider-user
package com.learn.cloud.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ServerController {@GetMapping("/msg")public String msg() {return "this is product' msg";}
}
package com.learn.cloud;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@MapperScan(value="com.learn.cloud.mapper")
@EnableEurekaClient
@SpringBootApplication
public class ProductApplication {public static void main(String[] args) {SpringApplication.run(ProductApplication.class, args);}
}
package com.learn.cloud;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@MapperScan(value="com.learn.cloud.mapper")
@EnableEurekaClient
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}
package com.learn.cloud.conf;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
package com.learn.cloud.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class ClientController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/getProductMsg")public String getProductMsg() {// 1.第一種方式(直接使用RestTemplate,url寫死)
// RestTemplate restTemplate = new RestTemplate();
// String response = restTemplate.getForObject("http://localhost:8080/msg", String.class);
// System.out.println(response);// 第二種方式(利用loadBalancerClient通過應用名獲取url,然后再使用restTemplate)
// ServiceInstance serviceInstance = this.loadBalancerClient.choose("PRODUCT");
// String url = String.format("http://%s:%s", serviceInstance.getHost(),serviceInstance.getPort()+"/msg");
// System.out.println(url);
// return restTemplate.getForObject(url, String.class);// 3.第三種方式(利用@LoadBalanced,可以在restTemplate里使用應用名字)String response = restTemplate.getForObject("http://PRODUCT/msg", String.class);System.out.println(response); return response;}
}
?
總結
以上是生活随笔為你收集整理的RestTemplate的三种使用方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点餐业务服务拆分分析
- 下一篇: 负载均衡器 Ribbion