溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringCloud之RestTemplate的使用

發(fā)布時(shí)間:2020-07-23 10:39:43 來(lái)源:網(wǎng)絡(luò) 閱讀:474 作者:nineteens 欄目:編程語(yǔ)言

  源碼

  GitHub

  RestTemplate是什么?

  RestTemplate是Spring對(duì)Http客戶端進(jìn)行封裝的一個(gè)模板工具類,對(duì)常用的Http客戶端例如:HttpClient、OKHttp、JDK原生的URLConnection(默認(rèn)的)都支持。

  RestTemplate能做什么?

  基于Restful風(fēng)格可以對(duì)遠(yuǎn)程服務(wù)基于http協(xié)議進(jìn)行遠(yuǎn)程調(diào)用

  RestTemplate的使用

  新建一個(gè)父工程,命名為springcloud-eureka01

  目錄結(jié)構(gòu)如下圖:

  pom.xml:

  org.springframework.boot

  spring-boot-starter-parent

  2.0.0.RELEASE

  org.springframework.boot

  spring-boot-starter

  org.springframework.boot

  spring-boot-devtools

  runtime

  true

  org.springframework.boot

  spring-boot-starter-test

  test

  org.springframework.boot

  spring-boot-maven-plugin

  新建模塊,命名為eureka-provider01

  目錄結(jié)構(gòu)如下圖:

  pom.xml:

  com.wyj

  springcloud-eureka01

  0.0.1-SNAPSHOT

  org.springframework.boot

  spring-boot-starter-data-jpa

  org.springframework.boot

  spring-boot-starter-web

  mysql

  mysql-connector-java

  runtime

  org.projectlombok

  lombok

  true

  ProviderController:

  @Controller

  public class ProviderController {

  @Autowired

  private UserService userService;

  @RequestMapping(value = "/{id}")

  @ResponseBody

  public User findById(@PathVariable int id) {

  User user = userService.findById(id);

  return user;

  }

  }

  UserService:

  public interface UserService {

  public User findById(int id);

  }

  UserServiceImpl:

  @Service

  public class UserServiceImpl implements UserService {

  @Autowired

  private UserRepository userRepository;

  @Override

  public User findById(int id) {

  Optional userOptional = userRepository.findById(id);

  User user = userOptional.get();

  return user;

  }

  }

  UserRepository:

  public interface UserRepository extends JpaRepository {

  }

  User:

  @Entity

  @Data

  public class User implements Serializable {

  @Id

  @GeneratedValue

  private int id;

  private String name;

  private String sex;

  private int age;

  private String address;

  private String phone;

  }

  application.properties:

  server.port=8081

  spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springcloud-eureka01?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true

  spring.datasource.driver-class-name=com.mysql.jdbc.Driver

  spring.datasource.username=root

  spring.datasource.password=root

  spring.jpa.show-sql=true

  spring.jpa.hibernate.ddl-auto=update

  spring.jpa.properties.hibernate.format_sql=true

  spring.jpa.properties.hibernate.use_sql_comments=true

  spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

  新建模塊,命名為eureka-consumer01

  目錄結(jié)構(gòu)如下圖:

  pom.xml:

  com.wyj

  springcloud-eureka01

  0.0.1-SNAPSHOT

  org.springframework.boot

  spring-boot-starter-web

  org.projectlombok

  lombok

  true

  ConsumerController:

  @Controller

  public class ConsumerController{

  @Autowired

  private RestTemplate restTemplate;

  @RequestMapping(value = "/findById/{id}")

  @ResponseBody

  public User findById(@PathVariable int id) {

  User user = restTemplate.getForObject("http://127.0.0.1:8081/" + id, User.class);

  return user;

  }無(wú)錫×××醫(yī)院 https://yyk.familydoctor.com.cn/20612/

  }

  RestConfig:

  @Configuration

  public class RestConfig {

  @Bean

  public RestTemplate restTemplate() {

  return new RestTemplate();

  }

  }

  User:

  @Data

  public class User implements Serializable {

  private int id;

  private String name;

  private String sex;

  private int age;

  private String address;

  private String phone;

  }

  測(cè)試使用

  分別啟動(dòng)eureka-provider01和eureka-consumer01,啟動(dòng)順序沒(méi)關(guān)系

  瀏覽器訪問(wèn)http://127.0.0.1:8080

  總結(jié)

  在ConsumerController中,RestTemplate調(diào)用遠(yuǎn)程服務(wù)

  User user = restTemplate.getForObject("http://127.0.0.1:8081", User.class);

  RestTemplate通過(guò)getForObject方法傳遞url地址及實(shí)體類的字節(jié)碼,自動(dòng)發(fā)起請(qǐng)求,接收響應(yīng),并且?guī)臀覀儗?duì)響應(yīng)結(jié)果通過(guò)SpringMVC內(nèi)置的Jackson中的ObjectMapper進(jìn)行json反序列化,最后返回一個(gè)User對(duì)象

  雖然RestTemplate能夠調(diào)用遠(yuǎn)程服務(wù),但是這樣還存在著很多問(wèn)題:

  1、請(qǐng)求地址http://127.0.0.1:8081/硬編碼了,如果更換環(huán)境,那么需要更改大量的代碼

  2、并沒(méi)有一個(gè)中心來(lái)控制并管理provider和consumer之間的關(guān)系與調(diào)用

  3、使用RestTemplate調(diào)用遠(yuǎn)程服務(wù)代碼開(kāi)發(fā)量相對(duì)而言大,現(xiàn)在的Demo是業(yè)務(wù)簡(jiǎn)單,只需要簡(jiǎn)單調(diào)用getForObject就能獲取數(shù)據(jù)。事實(shí)上,RestTemplate還有大量基于Http協(xié)議的方法,比如delete()、getForEntity()、getForObject()、put()、headForHeaders()等。但是在后期的SpringCloud學(xué)習(xí)過(guò)程中,F(xiàn)eign作為SpringCloud的核心組件,用于遠(yuǎn)程服務(wù)調(diào)用,也是基于Http協(xié)議,并且支持注解開(kāi)發(fā),能夠大量減少開(kāi)發(fā)量


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI