【微服务~远程调用】 目前主要更新微服务,一起学习一起进步。
本期主要介绍微服务~远程调用
2个团队,分别开发了“商品管理系统”和“用户管理系统”
问题:“商品管理系统”需要使用“用户管理系统”某个功能,怎么办?
根据用户的会员等级,显示不同的打折
区别 | HTTP | RPC |
---|---|---|
速度 | 较慢 | 快 |
难度 | 简单 | 复杂 |
灵活性 | 灵活,跨平台、跨语言 |
如何选择
基于Http
的Rest风格服务。
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-build</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
<properties>
<spring.cloud.version>Hoxton.SR12</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.7-SNAPSHOT</spring.cloud.alibaba.version>
<mybatis.plus.starter.version>3.4.0</mybatis.plus.starter.version>
<durid.starter.version>1.1.10</durid.starter.version>
<swagger.version>2.7.0</swagger.version>
<jwt.jjwt.version>0.9.0</jwt.jjwt.version>
<jwt.joda.version>2.9.7</jwt.joda.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.starter.version}</version>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${durid.starter.version}</version>
</dependency>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!--支持lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
server:
port: 7778
package com.czxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created by liangtong.
*/
@SpringBootApplication
public class DataApplication {
public static void main(String[] args) {
SpringApplication.run(DataApplication.class, args);
}
}
package com.czxy.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by liangtong.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer uid;
private String username;
private String password;
private Integer age;
}
package com.czxy.controller;
import com.czxy.domain.User;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by liangtong.
*/
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping
public BaseResult findAll(){
List<User> list = new ArrayList<>();
list.add(new User(1,"jack","1234",18));
list.add(new User(2,"rose","5678",21));
list.add(new User(3,"tom","6666",25));
return BaseResult.ok("查询所有",list);
}
@GetMapping("/{uid}")
public BaseResult findById(@PathVariable("uid")Integer uid){
User user = new User(1,"jack","1234",18);
return BaseResult.ok("查询成功",user);
}
@GetMapping("/search")
public BaseResult search(User user){
System.out.println(user);
return BaseResult.ok("查询成功",user);
}
@PostMapping
public BaseResult save(@RequestBody User user){
System.out.println(user);
// return ResponseEntity.status(302).body(BaseResult.ok("添加成功"));
return BaseResult.ok("添加成功");
}
@PutMapping
public BaseResult update(@RequestBody User user){
System.out.println(user);
return BaseResult.ok("更新成功");
}
@DeleteMapping("/{uid}")
public BaseResult deleteById(@PathVariable("uid")Integer uid){
System.out.println(uid);
return BaseResult.ok("删除成功");
}
}
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<!--支持lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
package com.czxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HttpApplication {
public static void main(String[] args) {
SpringApplication.run(HttpApplication.class, args);
}
}
package com.czxy;
public class TestHttp {
}
@Test
public void testFindAll() {
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpGet httpGet = new HttpGet("http://localhost:7778/user");
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200) {
String str = EntityUtils.toString(response.getEntity());
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testFindId() {
String id = "1";
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpGet httpGet = new HttpGet("http://localhost:7778/user/" + id);
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200) {
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testDemo03(){
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
StringBuilder params = new StringBuilder();
params.append("username=张三");
params.append("&");
params.append("password=1234");
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpGet httpGet = new HttpGet("http://localhost:7778/user/search" + "?" + params.toString());
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
// 3.1 获得响应数据的类型
System.out.println(response.getEntity().getContentType());
// 3.2 获得响应体内容
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testDemo04(){
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
StringBuilder params = new StringBuilder();
params.append("username=" + URLEncoder.encode("&","UTF-8"));
params.append("&");
params.append("password=1234");
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpGet httpGet = new HttpGet("http://localhost:7778/user/search" + "?" + params.toString());
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == 200){
// 3.1 获得响应数据的类型
System.out.println(response.getEntity().getContentType());
// 3.2 获得响应体内容
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testInsert() {
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpPost httpPost = new HttpPost ("http://localhost:7778/user/");
// 2.1 准备json数据
String jsonStr = "{\n" +
" \"uid\": \"1\",\n" +
" \"username\": \"jack\",\n" +
" \"password\": \"1234\",\n" +
" \"age\": \"18\"\n" +
" }";
// 2.2 设置请求体
httpPost.setEntity(new StringEntity(jsonStr,"UTF-8"));
// 2.3 设置请求数据类型为json
httpPost.setHeader("content-type","application/json;charset=UTF-8");
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpPost);
if(response.getStatusLine().getStatusCode() == 200) {
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
@Test
public void testInsert2() {
try {
//1 创建Httpclient对象,相当于打开了浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
//2 确定请求方式和请求路径,相当于在浏览器输入地址
HttpPost httpPost = new HttpPost ("http://localhost:7778/user/");
// 2.1 准备json数据
User user = new User(1,"jack","1234",18);
String jsonStr = JSON.toJSONString(user);
// 2.2 设置请求体
httpPost.setEntity(new StringEntity(jsonStr,"UTF-8"));
// 2.3 设置请求数据类型为json
httpPost.setHeader("content-type","application/json;charset=UTF-8");
//3 执行请求并获取响应,相当于敲完地址后按下回车。
CloseableHttpResponse response = httpClient.execute(httpPost);
if(response.getStatusLine().getStatusCode() == 200) {
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(str);
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}