前提
以Dept部门模块(基本的CURD)做一个微服务通用案例,Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
需要了解:
Maven的分包分模块架构.
- 一个Project带着多个Module子模块
- MicroServiceCloud父工程(Project)下带着三个子模块(Module)
1、如何创建父子工程模块
1.1 创建父工程
创建一个project工程(创建一个maven工程,主要是p使用om文件),然后删除多余的文件只留下pom.xml文件就可以。
查看父工程的pom。等下创建结束子工程后,查看pom文件的变化
<?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>org.example</groupId>
<artifactId>FatherDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
1.2 创建子模块
在父工程上新建子模块module,创建的module同样是maven工程,
查看父子目录
1.2.1 查看子模块的pom文件
1.2.2 查看父工程的pom文件
2、Rest微服务构建
2.1 构建基本说明
这里进行三个微服务的提供,一个公共模块,一个服务消费。暂时不考虑服务注册与发现,负载均衡、服务熔断降级、网关等服务情况。【具体的实现过程同1】
2.2 将服务完善
2.2.1 通用的pom依赖放在父工程中
比如常用的数据库连接、数据池、日志等
<?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>org.zyz</groupId>
<artifactId>microservicecloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>microservicecloud-api</module>
<module>microservicecloud-provider-dept-8001</module>
<module>microservicecloud-consumer-dept-80</module>
<module>microservicecloud-provider-dept-8002</module>
<module>microservicecloud-provider-dept-8003</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>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-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.2.2 公共模块编写
2.2.3 服务提供者
3个服务、每个服务都可以当成一个单体应用来写。服务的具体实现等编码
2.2.4 服务消费者
调用服务提供的服务,这里只是简单的调用多个不同的服务。这里应该使用eureka、ribbon等服务注册、负载均衡、服务熔断等机制。这里只作为简单的入门演示
package com.zyz.springcloud.controller;
import com.zyz.springcloud.entities.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* @author zyz
* @version 1.0
* @data 2023/2/12 23:07
* @Description:
*/
@RestController
public class DeptController_Consumer {
private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX2 = "http://localhost:8002";
private static final String REST_URL_PREFIX3 = "http://localhost:8003";
/**
* 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
*/
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
}
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
}
/**
* 测试@EnableDiscoveryClient,消费端可以调用服务发现
*/
@RequestMapping(value = "/consumer/dept/discovery")
public Object discovery() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);
}
/**
* 测试服务2
*/
@RequestMapping(value = "/consumer/dept/get2/{id}")
public Dept get2(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX2 + "/dept/get/" + id, Dept.class);
}
/**
* 测试服务3
*/
@RequestMapping(value = "/consumer/dept/get3/{id}")
public Dept get3(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX3 + "/dept/get/" + id, Dept.class);
}
}
2.2.5 数据库创建
不同的服务调用不同的数据库,可以方便的扩容服务,更加高效实现流量的控制访问