1 . 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来定义,而不是根据基于网络的应用来定义。
2. Http客户端工具
常见Http客户端工具:HttpClient、OKHttp、URLConnection。
Spring的RestTemplate
(1)RestTemplate介绍
(2)RestTemplate入门案例
我们可以使用RestTemplate实现上图中的请求,springcloud-day1-resttemplate
通过发送请求,请求springcloud-day1-provider
的/user/list
方法。
(1)搭建springcloud-day1-provider
这里不演示详细过程了,大家直接使用IDEA搭建一个普通的SpringBoot工程即可。
坐标
com.itheima
springcloud-day1-provider
0.0.1-SNAPSHOT
pom.xml依赖
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
org.springframework.boot
spring-boot-starter-web
创建com.itheima.domain.User
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;
}
//..get set toString 略
}
application.properties
server.port=18081
创建com.itheima.controller.UserController
,代码如下:
@RestController
@RequestMapping(value = "/user")
public class UserController {
/***
* 提供服务
* @return
*/
@RequestMapping(value = "/list")
public List list(){
List users = new ArrayList();
users.add(new User("王五", "深圳", 25));
users.add(new User("李四", "北京", 23));
users.add(new User("赵六", "上海", 26));
return users;
}
}
创建启动类,并启动工程
@SpringBootApplication
public class SpringcloudDay1ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDay1ProviderApplication.class, args);
}
}
访问:
效果如下:
(2)创建springcloud-day1-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
创建启动类,并在启动类中创建RestTemplate对象
@SpringBootApplication
public class SpringcloudDay1ResttemplateApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDay1ResttemplateApplication.class, args);
}
/***
* @Bean:创建一个对象实例,并将对象交给Spring容器管理
*
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
测试
在测试类HttpDemoApplicationTests中@Autowired
注入RestTemplate
通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码
RestTemplate会自动发起请求,接收响应
并且帮我们对响应结果进行反序列化
代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringcloudDay1ResttemplateApplicationTests {
@Autowired
private RestTemplate restTemplate;
/****
* RestTemplate远程调用
*/
@Test
public void testRestTemplateQuery() {
String url = "http://localhost:18081/user/list";
String result = restTemplate.getForObject(url, String.class);
System.out.println(result);
}
}
运行测试方法,效果如下:
RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。
RestTemplate:
①RestTemplate是Rest的HTTP客户端模板工具类。
②对基于Http的客户端进行封装。
③实现对象与JSON的序列化与反序列化。
④不限定客户端类型