日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RestTemplate的三种使用方式

發布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的三种使用方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。