概述
本文基本环境
技术 | 版本 |
---|---|
could | Hoxton.SR1 |
boot | 2.2.2.RELEASE |
cloud alibaba | 2.1.0.RELEASE |
Java | 11 |
Maven | 3.5及以上 |
Mysql | 5.7及以上 |
现阶段主要的微服务(×表示已经停更)
文章导航
环境搭建 | 服务注册中心 | 服务调用 | 服务调用2 | 服务降级 | 服务网关 | 服务配置 | 服务总线 |
---|---|---|---|---|---|---|---|
微服务环境搭建 | Eureka | Ribbon | Feign | Hystrix | Zuul | Config | Bus |
zookeeper | LoadBalancer | OpenFeign | resilience4j | Zuul2 | Nacos | Nacos | |
Consul | sentinel | gatewat | |||||
Nacos |
微服务环境搭建
约定 > 配置 > 编码
1. 微服务cloud整体聚合父工程Project
-
new project
-
聚合总父工程名字
-
选额maven版本
-
设置字符编码
-
注解生效激活
-
Java编译版本
-
File Types过滤
创建完工程后,idea上会新建.iml
等文件,我是看着不舒服的,所以将其过滤不显示。
2. 父工程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>com.zf.springcloud</groupId>
<artifactId>SpringCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 统一管理jar包版本 -->
<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.18.22</lombok.version>
<mysql.version>8.0.27</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</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>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
maven复习
1. Maven中的DependencyManagement
和Dependencies
dependencyManagement
Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。
通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素。
使用pom.xml 中的dependencyManagement 元素能让所有在子项目中引用一个依赖而不用显式的列出版本号。
Maven 会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用这个dependencyManagement 元素中指定的版本号。
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖
如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;
如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
maven跳过单元测试
- 方式一、配置
<build><!-- maven中跳过单元测试 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
- 方式二、idea工具支持(推荐)
选中这个小闪电的图标,test就不能被选中了
父工程创建完成执行mvn:install
将父工程发布到仓库方便子工程继承
或者使用idea工具
3. Rest微服务工程构建
1. cloud-provider-payment8001
微服务提供者支付Module模块
-
建模块
-
改
pom
<dependencies>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.zf.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 写
yml
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包 com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud2022?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.zf.springcloud.entities # 所有Entity别名类所在包
- 主启动
/**
* @author pumpkin
* @date 2022/1/13 0013 上午 0:01
*/
@SpringBootApplication
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args) ;
}
}
- 业务类
a. 建表SQL
CREATE TABLE `payment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`serial` varchar(200) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
b. 新建entities包
主实体Payment类
/**
* @author pumpkin
* @date 2022/1/13 0013 下午 20:02
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id ;
private String serial ;
}
JSON封装体ConmonResult(用于统一返回前端信息)
/**
* @author pumpkin
* @date 2022/1/13 0013 下午 20:02
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private int code ;
private String message ;
private T data ;
public CommonResult(int code, String message) {
this(code , message ,null) ;
}
}
c.dao
层
接口PaymentDao
/**
* @author pumpkin
* @date 2022/1/13 0013 上午 0:39
*/
@Mapper
public interface PaymentDao {
public int create(Payment payment) ;
public Payment getPaymentById(@Param("id") Long id) ;
}
mybatis的映射文件PaymentMapper.xml
,放在src/main/resources/mapper/PaymentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zf.springcloud.dao.PaymentDao">
<insert id="create" parameterType="com.zf.springcloud.entities.Payment" useGeneratedKeys="true" keyProperty="id">
INSERT INTO payment(serial) values(#{serial}) ;
</insert>
<resultMap id="BaseResultMap" type="com.zf.springcloud.entities.Payment">
<id column="id" property="id" jdbcType="BIGINT"></id>
<result column="serial" property="serial" jdbcType="VARCHAR" />
</resultMap>
<select id="getPaymentById" parameterType="long" resultMap="BaseResultMap">
SELECT * FROM payment where id = #{id}
</select>
</mapper>
d. service
层
接口PaymentService
/**
* @author pumpkin
* @date 2022/1/13 0013 上午 0:52
*/
public interface PaymentSerivce {
public int create(Payment payment) ;
public Payment getPaymentById(@Param("id") Long id) ;
}
PaymentService接口的实现类PaymentServiceImpl
/**
* @author pumpkin
* @date 2022/1/13 0013 上午 0:54
*/
@Service
public class PaymentServiceImpl implements PaymentSerivce {
@Autowired
private PaymentDao paymentDao ;
@Override
public int create(Payment payment) {
return paymentDao.create(payment);
}
@Override
public Payment getPaymentById(Long id) {
return paymentDao.getPaymentById(id);
}
}
e. controller
层
/**
* @author pumpkin
* @date 2022/1/13 0013 上午 0:56
*/
@RestController
@Slf4j
public class PaymentController {
@Autowired
private PaymentSerivce paymentSerivce ;
@Autowired
private DiscoveryClient discoveryClient ;
@Value("${server.port}")
private String serverPort ;
@PostMapping(value = "/payment/create")
public CommonResult<Integer> create( @RequestBody Payment payment){
int result = paymentSerivce.create(payment);
// log.info("***********插入操作返回结果{}**********" , result);
System.out.println("用户id" + payment.getId());
if( result > 0 ){
return new CommonResult(200 , "新增成功 , serverPort "+ serverPort , result) ;
}
else {
return new CommonResult(444 , "新增失败" ,null) ;
}
}
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
Payment payment = paymentSerivce.getPaymentById(id);
// log.info("***********查询结果{}**********" , payment);
if( payment != null ){
return new CommonResult(200 , "查询成功 , serverPort" + serverPort , payment) ;
}
else {
return new CommonResult(444 , "查询失败") ;
}
}
- 测试