Spring Cloud Alibaba
微服务环境搭建
商品微服务
- 查询商品列表
订单微服务
- 创建订单
模块设计
模块 | 介绍 | 简述 |
---|---|---|
shop-parent | 父工程 | |
shop-product-api | 商品微服务API | 存放商品实体 |
shop-product-server | 商品微服务 | 端口:808X |
shop-order-api | 订单微服务API | 存放订单实体 |
shop-order-server | 订单微服务 | 端口:809X |
使用版本
名称 | 版本 |
---|---|
Spring Cloud | Hoxton.SR8 |
Spring Cloud Alibaba | 2.2.3.RELEASE |
Spring Boot | 2.3.2.RELEASE |
Nacos
Nacos提供了一组简单易用的特性集,用户快速实现动态范围发现,服务配置,服务元数据及流量管理,相比Eureka本人觉得Nacos的界面更加的简洁清楚,关键还有中文:)
使用Nacos
添加
nacos
依赖1
2
3
4<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>主类中添加注解
@EnableDisoveryClient
1
2
3
4
5
6
7
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}在配置文件添加
nacos
服务地址1
2
3
4
5
6
7
8server:
port: 8081
spring:
application:
name: product-service
cloud:
nacos:
server-addr: localhost:8848启动 nacos 命令(只启动一个):
startup.cmd -m standalone
配置中心
创建
bootstrap.yml
在其中配置基础信息,包含启动端口
,微服务名称
,nacos地址
,配置文件类型
,配置版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#启动端口
server:
port: 8091
spring:
application:
#微服务名称
name: order-service
cloud:
nacos:
#nacos地址
server-addr: 127.0.0.1:8848
config:
#要从nacos读取的配置文件类型
file-extension: yaml
profiles:
#配置文件版本
active: dev #dev在nacos添加配置
Gateway网关
导入依赖
1
2
3
4
5
6
7
8<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>创建主类
1
2
3
4
5
6
7
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class,args);
}
}配置gateway
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19server:
port: 9000
spring:
application:
name: api-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true #使gateway可以获取nacos中的服务清单
routes:
- id: product_route #路由标识符
uri: lb://product-service #客户端顶球最终被转发到的微服务
predicates: #断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由
- Path=/pro/**
filters: #过滤器
- StripPrefix=1 #去掉n级前缀
过滤器
局部过滤器
1 | /* |
全局过滤器
1 |
|
Mybatis-plus
导入依赖
1
2
3
4
5<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>配置
sql
基础信息1
2
3
4
5
6
7
8
9
10spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/testmp09?useUnicode=true&character=utf8
username: root
password: root
#输出sql语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl新建
接口
集成BaseMapper
这个类实现了绝大多数的sql
需求1
2
3
4
5
6
7
8
9
10
11
12
13package cn.konfan.testmp.mapper;
import cn.konfan.testmp.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author MrLv
* @date 2022/1/18
* @apiNote
*/
public interface UserMapper extends BaseMapper<User>{
}BaseMapper
实现了 增删改查等绝大多数的需求1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(; Map<String, Object> columnMap)
int delete(; Wrapper<T> wrapper)
int deleteBatchIds(; Collection<? extends Serializable> idList)
int updateById(; T entity)
int update(; T entity, Wrapper<T> updateWrapper)
T selectById(Serializable id);
List<T> selectBatchIds(; Collection<? extends Serializable> idList)
List<T> selectByMap(; Map<String, Object> columnMap)
T selectOne(; Wrapper<T> queryWrapper)
Integer selectCount(; Wrapper<T> queryWrapper)
List<T> selectList(; Wrapper<T> queryWrapper)
List<Map<String, Object>> selectMaps(; Wrapper<T> queryWrapper)
List<Object> selectObjs(; Wrapper<T> queryWrapper)
<E extends IPage<T>> E selectPage(E page, ; Wrapper<T> queryWrapper)
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, ; Wrapper<T> queryWrapper)
}
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package cn.konfan.testmp.mapper;
import cn.konfan.testmp.entity.User;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author MrLv
* @date 2022/1/19
* @apiNote
*/
class UserMapperTest {
private UserMapper userMapper;
void testSave() {
User user = new User(null, "小明", "12345678@163.com", 20);
int insert = userMapper.insert(user);
System.out.println(insert);
System.out.println(user.getId());
}
}
ActiveRecord(AR)
ActiveRecord 是什么:
- 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中
表的一行记录; 通常表的每个字段在类中都有相应的 Field; - ActiveRecord 负责把自己持久化. 在 ActiveRecord 中封装了对数据库的访
问,通过对象自己实现 CRUD,实现优雅的数据库操作。 - ActiveRecord 也封装了部分业务逻辑。可以作为业务对象使用。
1 | package cn.konfan.testmp.entity; |
Dept extends Model
会依赖同名Mapper
1 | package cn.konfan.testmp.mapper; |
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27package cn.konfan.testmp.entity;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author MrLv
* @date 2022/1/19
* @apiNote
*/
class DeptTest {
void deptTest() {
Dept dept = new Dept(null, "开发部", "1100011", 1);
boolean insert = dept.insert();
System.out.println(insert);
System.out.println(dept.getId());
}
}
QueryWrapper
1 |
|
分页
1 | /* |
查询测试
1
2
3
4
5
6
7
8
9
10
11
12
void page() {
QueryWrapper<Student> qw = new QueryWrapper<>();
qw.orderByAsc("age");
IPage<Student> page = new Page<>();
page.setCurrent(1);
page.setSize(3);
//Preparing: SELECT id,name,age,email,status FROM student ORDER BY age ASC LIMIT ?,?
//Parameters: 0(Long), 3(Long)
IPage<Student> pageResult = studentMapper.selectPage(page, qw);
System.out.println(pageResult.getRecords());
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夏尾的布唠隔!
评论