RPC和HTTP
常见远程调用方式:
RPC:(Remote Produce Call)远程过程调用
1.基于Socket 2.自定义数据格式 3.速度快,效率高 4.典型应用代表:Dubbo,WebService,ElasticSearch集群间互相调用
HTTP:网络传输协议
1.基于TCP/IP 2.规定数据传输格式 3.缺点是消息封装比较臃肿、传输速度比较慢 4.优点是对服务提供和调用方式没有任何技术限定,自由灵活,更符合微服务理念
RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。
Http客户端工具
常见Http客户端工具:HttpClient(发送Http请求)、OKHttp(发送Http请求)、URLConnection(发送Http请求)。
2 Spring的RestTemplate
(1)RestTemplate介绍
RestTemplate是Rest的HTTP客户端模板工具类
对基于Http的客户端进行封装
实现对象与JSON的序列化与反序列化(JSON<->JavaBean)
不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生URLConnection(默认方式)
(2)RestTemplate入门案例
我们可以使用RestTemplate实现请求,resttemplate
通过发送请求,请求sprovider
的/user/list
方法。
(1)搭建provider
使用IDEA搭建一个普通的SpringBoot工程即可。
pom.xml依赖
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
org.springframework.boot
spring-boot-starter-web
创建com.sen.bean.User
package com.sen.bean;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String address;
private Integer age;
public User() {
}
public User(String name, String address, Integer age) {
this.name = name;
this.address = address;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", age=" + age +
'}';
}
}
application.yml
server:
port: 18081
创建com.sen.controller.UserProviderController
,代码如下:
package com.sen.controller;
import com.sen.bean.User;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserProviderController {
@RequestMapping("/find/{id}")
public User find(@PathVariable Integer id) {//http://localhost:18081/user/find/1
User user = new User();
user.setName("fbb");
return user;
}
}
创建启动类,并启动工程
package com.sen;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserProvideApplication {
public static void main(String[] args) {
SpringApplication.run(UserProvideApplication.class, args);
}
}
访问:http://localhost:18081/user/find/1
效果如下:
(2)创建resttemplate
直接使用IDEA创建一个SpringBoot工程即可。
pom.xml依赖
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
application.yml
server:
port: 18082
创建启动类,并在启动类中创建RestTemplate对象
package com.sen;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试
通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码
RestTemplate会自动发起请求,接收响应
并且帮我们对响应结果进行反序列化
控制器代码如下:
package com.sen.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/consumer")
public class UserConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/find")
public String find() {
String url = "http://localhost:18081/user/find/1";
String json = restTemplate.getForObject(url, String.class);
System.out.println(json);//{"name":"fbb","address":null,"age":null}
return json;
}
}
RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。
RestTemplate:
①RestTemplate是Rest的HTTP客户端模板工具类。
②对基于Http的客户端进行封装。
③实现对象与JSON的序列化与反序列化。
④不限定客户端类型
RestTemplate的使用
创建一个RestTemplate,将该对象实例给SpringIOC容器管理 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } restTemplate.getForObject(url,String.class);