Rest环境搭建:服务提供者和消费者
4.1 介绍
- 我们会使用一个Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
- 回顾Spring,SpringMVC,Mybatis等以往学习的知识。
- Maven的分包分模块架构复习。
一个简单的Maven模块结构是这样的:-- app-parent: 一个父项目(app-parent)聚合了很多子项目(app-util\app-dao\app-web...)|-- pom.xml||-- app-core||---- pom.xml||-- app-web||---- pom.xml......
一个父工程带着多个Moudule子模块
MicroServiceCloud父工程(Project)下初次带着3个子模块(Module)
- microservicecloud-api 【封装的整体entity/接口/公共配置等】
- microservicecloud-consumer-dept-80 【服务消费者】
- microservicecloud-provider-dept-8001 【服务提供者】
版本选择
大版本说明
SpringBoot | SpringCloud | 关系 |
---|---|---|
1.2.x | Angel版本(天使) | 兼容SpringBoot1.2x |
1.3.x | Brixton版本(布里克斯顿) | 兼容SpringBoot1.3x,也兼容SpringBoot1.4x |
1.4.x | Camden版本(卡姆登) | 兼容SpringBoot1.4x,也兼容SpringBoot1.5x |
1.5.x | Dalston版本(多尔斯顿) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x |
1.5.x | Edgware版本(埃奇韦尔) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x |
2.0.x | Finchley版本(芬奇利) | 兼容SpringBoot2.0x,不兼容SpringBoot1.5x |
2.1.x | Greenwich版本(格林威治) |
实际开发版本关系
spring-boot-starter-parent | spring-cloud-dependencles | ||
---|---|---|---|
版本号 | 发布日期 | 版本号 | 发布日期 |
1.5.2.RELEASE | 2017-03 | Dalston.RC1 | 2017-x |
1.5.9.RELEASE | 2017-11 | Edgware.RELEASE | 2017-11 |
1.5.16.RELEASE | 2018-04 | Edgware.SR5 | 2018-10 |
1.5.20.RELEASE | 2018-09 | Edgware.SR5 | 2018-10 |
2.0.2.RELEASE | 2018-05 | Fomchiey.BULD-SNAPSHOT | 2018-x |
2.0.6.RELEASE | 2018-10 | Fomchiey-SR2 | 2018-10 |
2.1.4.RELEASE | 2019-04 | Greenwich.SR1 | 2019-03 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zr7qtaGV-1610696537728)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210114191102105.png)]
使用后两个
创建父工程
- 新建父工程项目springcloud,切记Packageing是pom模式
- 主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类
pom.xml
<?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.haust</groupId><artifactId>springcloud</artifactId><version>1.0-SNAPSHOT</version><modules><module>springcloud-api</module><module>springcloud-provider-dept-8001</module><module>springcloud-consumer-dept-80</module><module>springcloud-eureka-7001</module><module>springcloud-eureka-7002</module><module>springcloud-eureka-7003</module><module>springcloud-provider-dept-8002</module><module>springcloud-provider-dept-8003</module><module>springcloud-consumer-dept-feign</module><module>springcloud-provider-dept-hystrix-8001</module><module>springcloud-consumer-hystrix-dashboard</module><module>springcloud-zuul-9527</module><module>springcloud-config-server-3344</module><module>springcloud-config-client-3355</module><module>springcloud-config-eureka-7001</module><module>springcloud-config-dept-8001</module></modules><!--打包方式 pom--><packaging>pom</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.2.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--springCloud的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR1</version><type>pom</type><scope>import</scope></dependency><!--SpringBoot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.4.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--SpringBoot 启动器--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--日志测试~--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement></project>
父工程为springcloud,其下有多个子mudule,详情参考完整代码了解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ph2yN66N-1610696537730)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210114203950885.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vbj1pl9v-1610696537733)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210114205910420.png)]
springcloud-provider-dept-8001(提供者)
server:port: 8001
mybatis:type-aliases-package: com.kuang.springcloud.pojoconfig-location: classpath:mybatis/mapper-config.xmlmapper-locations: classpath:mybatis/mapper/*.xml# spring配置
spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456
springcloud-consumer-dept-80访问springcloud-provider-dept-8001下的controller使用REST方式
springcloud-consumer-dept-80(消费者)
80端口请求的时候不用带端口号
如DeptConsumerController.java
/*** @Auther: csp1999* @Date: 2020/05/17/22:44* @Description:*/
@RestController
public class DeptConsumerController {/*** 理解:消费者,不应该有service层~* RestTemplate .... 供我们直接调用就可以了! 注册到Spring中* (地址:url, 实体:Map ,Class<T> responseType)* <p>* 提供多种便捷访问远程http服务的方法,简单的Restful服务模板~*/@Autowiredprivate RestTemplate restTemplate;/*** 服务提供方地址前缀* <p>* Ribbon:我们这里的地址,应该是一个变量,通过服务名来访问*/private static final String REST_URL_PREFIX = "http://localhost:8001";//private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";/*** 消费方添加部门信息* @param dept* @return*/@RequestMapping("/consumer/dept/add")public boolean add(Dept dept) {// postForObject(服务提供方地址(接口),参数实体,返回类型.class)return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);}/*** 消费方根据id查询部门信息* @param id* @return*/@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id) {// getForObject(服务提供方地址(接口),返回类型.class)return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);}/*** 消费方查询部门信息列表* @return*/@RequestMapping("/consumer/dept/list")public List<Dept> list() {return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);}
}
RestTemplete
使用RestTemplete先需要放入Spring容器中
提供多种便捷访问远程http服务的方法,简单的Restful服务模板~
ConfigBean.java
@Configuration
public class ConfigBean {//@Configuration -- spring applicationContext.xml//配置负载均衡实现RestTemplate// IRule// RoundRobinRule 轮询// RandomRule 随机// AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~// RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
springcloud-provider-dept-8001的dao接口调用springcloud-api模块下的pojo,可使用在springcloud-provider-dept-8001的pom文件导入springcloud-api模块依赖的方式:
<!--我们需要拿到实体类,所以要配置api module--><dependency><groupId>com.haust</groupId><artifactId>springcloud-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
springcloud-consumer-dept-80和springcloud-provider-dept-8001的pom.xml和父工程下的依赖基本一样,直接看完整代码即可,不再添加重复笔记。
进行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFsAuSs9-1610696537737)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210114231512178.png)]