市面上有5种常见的电商模式 B2B、B2C、 C2B、C2C、O2O
1、B2B 模式
B2B (Business to Business),是指商家与商家建立的商业关系。如: 阿里巴巴
2、B2C 模式
B2C (Business to Consumer),就是我们经常看到的供应商直接把商品卖给用户,即"商对客”模式,也就是通常说的商业零售,直接面向消费者销售产品和服务。如:苏宁易购、京东、天猫、小米商城
3、C2B 模式
C2B (Customer to Business),即消费者对企业。先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产
4、C2C 模式
C2C (Customer to Consumer),客户之间自己把东西放上网去卖,如:淘宝,闲鱼
5、O2O 模式
O2O 即 online To Ofline,也即将线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。线上快速支付,线下优质服务。如:饿了么,美团,淘票票,京东到家
2、谷粒商城谷粒商城是一个 B2C 模式的电商平台,销售自营商品给客户。
2、项目架构图 1、项目微服务架构图 2、微服务划分图 3、项目技术&特色-
前后分离开发,并开发基于 vue 的后台管理系统
-
SpringCloud 全新的解决方案
-
应用监控、限流、网关、熔断降级等分布式方案全方位涉及
-
透彻讲解分布式事务、分布式锁等分布式系统的难点
-
分析高并发场景的编码方式,线程池,异步编排等使用
-
压力测试与性能优化
-
各种集群技术的区别以及使用
-
CI/CD 使用
-
…
学习项目的前置知识
-
熟悉 SpringBbot 以及常见整合方案
-
了解 SpringCloud
-
熟悉 git,maven
-
熟悉 linux,redis,docker 基本操作
-
了解 html,css,js,vue
-
熟练使用 idea 开发项目
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。 这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
2、集群 & 分布式 & 节点集群是个物理形态,分布式是个工作方式。
只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;
《分布式系统原理与范型〉定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
分布式系统(distributed system)是建立在网络之上的软件系统。
分布式是指将不同的业务分布在不同的地方。
集群指的是将几台服务器集中在一起,实现同一业务。
例如。京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的。我们就应该将用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化;
分布式中的每一个节点都可以做集群。而集群并不一定就是分布式的。
节点:集群中的一个服务器
3、远程调用在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称为远程调用。
SpringCloud 中使用 HTTP + JSON 的方式完成远程调用。
4、负载均衡分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器, 提升网站的健壮性。
常见的负载均衡算法:
轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
散列:根据请求源的 IP 的散列 (hash) 来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
5、服务注册/发现 & 注册中心A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务。
6、配置中心每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息。
7、服务熔断 & 服务降级在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
1、服务熔断设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据
2、服务降级在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理 【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】。
8、API 网关在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能同时提供了客户端负载均衡,服务自动熔断,灰度发布,统认证,限流流控,日志统计等丰富的功能,帮助我们解决很多 API 管理难题。
三、环境搭建 1、安装 linux 虚拟机-
可以使用 Oracle VM VirtualBox + Vagrant 实现
-
可以使用 VMware 实现
-
也可以直接使用云服务器
-
下载安装 VirtualBox https://www.virtualbox.org/ ,要开启CPU虚拟化
-
下载安装 Vagrant
-
下载 https://www.vagrantup.com/
-
镜像仓库 https://app.vagrantup.com/boxes/search
-
-
打开 window cmd 窗口,运行 Vagrant init centos/7 ,即可初始化一个 centos7 系统
-
运行 vagrant up 即可启动虚拟机(在电脑当前用户目录下有 Vagrantfile 文件)。系统 root 用户的密码是 vagrant
-
vagrant 其他常用命令
-
vagrant ssh :自动使用 vagrant 用户连接虚拟机
- vagrant upload source [destination][name|id] :上传文件
-
vagrant 命令行 :https://www.vagrantup.com/docs/cli/init
-
-
默认虚拟机的 ip 地址不是固定 ip ,开发不方便
-
修改 Vagrantfile
config.vm.network "private_network",ip: "192.168.56.10" 这里的 ip 需要在物理机下使用 ipconfig 命令找到 VirtualBox 的地址是 192.168.56.1 这里我们选择将 Vagrantfile ip 修改为 192.168.56.10
-
重新使用 vagrant up 启动机器即可。然后再 vagrant ssh 连接机器
-
-
默认只允许 ssh 登录方式,为了后来操作方便,文件上传等,我们可以配置允许账号密码登录
Vagrant ssh 进去系统之后 vi /etc/ssh/sshd_config 修改 PasswordAuthentication yes/no 重启服务 service sshd restart
-
以后可以使用提供的 ssh 连接工具直接连接
Docker 虚拟化容器技术。Docker 基于境像, 可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间互相隔离。
Docker 安装文档:https://docs.docker.com/engine/install/centos/
1、卸载系统之前的 docker
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2、设置 Docker 存储库。之后,可以从存储库安装和更新 Docker
$ sudo yum install -y yum-utils
$ sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
3、安装最新版本的 Docker Engine 和容器
$ sudo yum install docker-ce docker-ce-cli containerd.io
4、启动Docker
$ sudo systemctl start docker
5、通过运行hello-world 映像来验证是否正确安装了 Docker Engine
$ sudo docker run hello-world
6、设置开机自启
$ sudo systemctl enable docker
7、配置 docker 阿里云镜像加速
阿里云-控制台-容器镜像服务-镜像加速器-配置镜像加速器
3、Docker 安装 MySQL1、下载镜像文件
docker pull mysql:5.7
2、创建实例并启动
docker run -p 3306:3306 --name mysql
-v /mydata/mysql/log:/var/log/mysql
-v /mydata/mysql/data:/var/lib/mysql
-v /mydata/mysql/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
参数说明:
-p 3306:3306 :将容器的3306端口映射到主机的3306端口 -v /mydata/mysql/conf:/etc/mysql :将配置文件夹挂载到主机 -v /mydata/mysql/log/mysql :将日志文件夹挂载到主机 -v /mydata/mysql/data:/var/lib/mysql/ :将配置文件夹挂载到主机 -e MYSQL_ROOT_PASSWORD=root :初始化root用户的密码
启动后,可以交互模式进入容器,查看mysql相关的目录命令: whereis mysql
3、MySQL配置
vi /mydata/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8mb4
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
注意:解决MySQL连接慢的问题
在配置文件中加入如下,并重启MySQL
[mysqld] skip-name-resolve
解析:
skip-name-resolve :跳过域名解析
4、设置 root 远程访问
5、进入容器文件系统
4、Docker 安装 Redis1、下载镜像文件
docker pull redis
2、创建实例并启动
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
docker run -p 6379:6379 --name redis
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf
redis 自描述文件:
https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf
redis 官网配置文件 https://redis.io/topics/config
3、开启redis持久化
vi /mydata/redis/conf/redis.conf
--输入
appendonly yes
4、使用 redis 镜像执行 redis-cli 命令连接
docker exec -it redis redis-cli
5、统一开发环境
1、Maven
//配置阿里云镜像
nexus-aliyun
Nexus aliyun
http://maven.aliyun.com/nexus/content/groups/public/
central
//配置jdk1.8编译项目
jdk-1.8
true
1.8
1.8
1.8
1.8
2、idea & vscode
idea安装插件
-
lombok
-
mybatisX
vscode安装插件
-
Auto Close Tag
-
Auto Rename Tag
-
Chinese
-
ESLint
-
HTML CSS Support
-
HTML Snippets
-
Javascript ES6
-
Live Server
-
open in browser
-
Vetur
1、下载 Git :https://git-scm.com/
2、配置 Git :进入git bash
# 配置用户名
git config -global user.name "usermame"I // (名字)
# 配置邮箱
git config -global user.email "username@email.com" // (注册账号时用的邮箱)
3、配置 ssh 免密登录
https://gitee.com/help/articles/4191#article-header0
进入 git bash 使用: ssh-keygen -t rsa -C "xxx@xxx.com"命令。连续三次回车。
一般用户目录下会有
id_rsa
id_rsa.pub
或者 cat ~/.ssh/id_rsa.pub
登录进入 gitee ,在设置里面找到 SSH KEY 将 .pub 文件的内容粘贴进去
使用 ssh-T git@gitee.com 测试是否成功即可
4、逆向工程使用
1、导入项目逆向工程
2、下载人人开源后台管理系统脚手架工程
-
导入工程,创建数据库
-
修改工程 shiro 依赖为 SpringSecurity
-
删除部分暂时不需要的业务
3、下载人人开源后台管理系统 vue 端脚手架工程
-
yscode 导入前端项目
-
前后端联调测试基本功能
商品服务、仓储服务、订单服务、优惠券服务、用户服务
共同:
-
web、openfeign
-
每一个服务,包名 com.atguigu.gulimall.xxx (product /order /ware /coupon /member)
-
模块名:guliall-coupon
在 Gitee 上创建一个仓库,并拉取下来
2、创建各个微服务项目创建项目模块
7、数据库初始化 四、快速开发 1、搭建后台管理系统使用人人开源(https://gitee.com/renrenio)的脚手架快速搭建后台管理系统
-
脚手架 renren-fast :后台管理系统后端项目
-
脚手架 renren-fast-vue :后台管理系统前端项目
使用人人开源的逆向工程项目(renren-generator),根据数据库表结构生成每个微服务的基本代码:entity、xml、dao、service 代码
3、配置&测试微服务CRUD功能
spring:
application:
name: gulimall-coupon
datasource:
url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
jackson:
date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
mapper-locations: classpath:/mapper*.xml
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
server:
port: 3000
logging:
level:
com.atguigu.gulimall: debug
五、分布式组件
1、SpringCloud Alibaba 简介
1)简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
2)为什么用Spring Cloud 的几大痛点:
-
Spring Cloud 部分组件停止维护和更新,给开发带来不便
-
Spring Cloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
-
Spring Cloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
Spring Cloud Alibaba 的优势:
-
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
-
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
-
搭建简单,学习曲线低
-
Spring Cloud Alibaba - Nacos:注册中心 (服务发现/注册)
-
Spring Cloud Alibaba Nacos:配置中心 (动态配置管理)
-
Spring Cloud - Ribbon:负载均衡
-
Spring Cloud - Feign:声明式 HTTP 客户端 (调用远程服务)
-
Spring Cloud Alibaba - Sentinel:服务容错 (限流、降级、熔断)
-
Spring Cloud - Gateway:API 网关 (weblux编程模式)
-
Spring Cloud - Sleuth:调用链监控
-
Spring Cloud Alibaba - Seata:原 Fescar ,即分布式事务解决方案
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 Spring Boot 版本号一致的版本:
-
1.5.x 版本适用于 Spring Boot 1.5.x
-
2.0.x 版本适用于 Spring Boot 2.0.x
-
2.1.x 版本适用于 Spring Boot 2.1.x
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用 java 编写,需要依赖 java 环境。
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html
1)引入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2)Nacos Server 启动
具体参考官网:https://nacos.io/zh-cn/docs/quick-start.html
Nacos Server 启动后,进入 http://localhost:8848 查看控制台 (默认账号名/密码为 nacos/nacos)
关于更多的 Nacos Server 版本,可以从 release 页面 下载最新的版本
3)Nacos 基本配置
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
如果不想使用 Nacos 作为您的服务注册与发现,可以将 spring.cloud.nacos.discovery 设置为 false。
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class CouponApplication {
public static void main(String[] args) {
SpringApplication.run(CouponApplication.class, args);
}
}
4)启动应用
观察 Nacos 控制台 服务列表是否已经注册上服务
注意:每一个应用都应该有名字,这样才能注册上去。修改 application.properties 文件
spring.application.name=service-provider
server.port=8000
3、SpringCloud OpenFeign 声明式远程调用
1)简介
Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。
Feign 整合了 Ribbon (负载均衡) 和 Hystrix (服务熔断),可以让我们不再需要显式地使用这两个组件。
Spring Cloud Feign 在 Netfix Feign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 Spring Cloud Ribbon 自行封装服务调用客户端的开发量。
2)使用1、引入依赖
org.springframework.cloud
spring-cloud-starter-openfeign
2、开启 feign 功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
3、 编写一个接口,告诉 Spring Cloud 这个接口需要调用远程服务
声明接口的每一个方法都是调用哪个远程服务的那个请求
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
4、编写 controller
@Autowired
private CouponFeignService couponFeignService;
@GetMapping("/coupons")
public R test() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("don");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("test"));
}
5、远程服务编写
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@RequestMapping("/member/list")
public R memberCoupons() {
return R.ok().put("test", "ok");
}
}
6、启动两个服务测试
访问 http://localhost:4000/member/member/coupons
成功返回 json
{
"msg": "success",
"code": 0,
"coupons": "ok",
"member": {
"id": null,
"levelId": null,
"username": null,
"password": null,
"nickname": "don",
"mobile": null,
"email": null,
"header": null,
"gender": null,
"birth": null,
"city": null,
"job": null,
"sign": null,
"sourceType": null,
"integration": null,
"growth": null,
"status": null,
"createTime": null
}
}
4、SpringCloud Alibaba Nacos 配置中心
1)引入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
2)配置文件中配置
在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3)Nacos 控制台配置
添加的配置的详情如下
dataId 为 gulimall-coupon.properties //默认规则,应用名.properties
group 为 DEFAULT_GROUP
内容如下
user.id=1
user.name=don
user.age=17
4)启动应用
应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能
@RefreshScope:动态获取并刷新配置
@Value("${配置项的名}"):获取到配置,如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置
5)配置中心-命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
6)配置中心-配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
7)配置中心-配置集IDNacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。 Data lD 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data lD 通常采用类 Java 包 ( 如 com.taobao.tc.refund.log.level ) 的命名规则保证全局唯一性。此命名规则非强制。
8)配置中心-配置分组Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
默认所有的配置集都属于:DEFAULT_GROUP
9)配置中心-加载多配置集该项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
将一个服务的配置文件,拆分成三部分:
1、在 coupon 命名空间下 新建配置
Data ID:datasource.yml
Group:dev
配置格式:YAML
配置内容:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
2、在 coupon 命名空间下 新建配置
Data ID:mybatis.yml
Group:dev
配置格式:YAML
配置内容:
mybatis-plus:
mapper-locations: classpath:/mapper*.xml
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
3、在 coupon 命名空间下 新建配置
Data ID:other.yml
Group:dev
配置格式:YAML
配置内容:
spring:
application:
name: gulimall-coupon
jackson:
date-format: yyyy-MM-dd HH:mm:ss
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 3000
logging:
level:
com.atguigu.gulimall: debug
4、修改 coupon 服务的 bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 29f44e4c-08ec-4f6b-b89c-2775fd72c275
group: dev
ext-config[0]:data-id: datasource.yml
ext-config[0].group: dev
ext-config[0].refresh: true
ext-config[1]:data-id: mybatis.yml
ext-config[1].group: dev
ext-config[1].refresh: true
ext-config[2]:data-id: other.yml
ext-config[2].group: dev
ext-config[2].refresh: true
5、注释掉 application.yml 的配置
将 application.yml 配置注释后,启动服务
:: Spring Boot :: (v2.2.2.RELEASE)
2020-07-10 10:18:42.168 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'datasource.yml', group: 'dev'
2020-07-10 10:18:42.174 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'mybatis.yml', group: 'dev'
2020-07-10 10:18:42.178 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'other.yml', group: 'dev'
2020-07-10 10:18:42.183 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'gulimall-coupon.properties', group: 'dev'
2020-07-10 10:18:42.184 INFO 4620 --- [ restartedMain] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon.properties'}, BootstrapPropertySource {name='bootstrapProperties-other.yml'}, BootstrapPropertySource {name='bootstrapProperties-mybatis.yml'}, BootstrapPropertySource {name='bootstrapProperties-datasource.yml'}]
2020-07-10 10:18:42.209 INFO 4620 --- [ restartedMain] c.a.gulimall.coupon.CouponApplication : No active profile set, falling back to default profiles: default
访问:http://localhost:3000/coupon/coupon/test
{"msg":"success","useAge":"18","code":0,"useName":"don"}
访问:http://localhost:3000/coupon/coupon/list
后台打印:
2020-07-10 10:21:41.372 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : ==> Preparing: SELECT id,min_point,note,amount,coupon_name,code,member_level,num,enable_end_time,use_type,enable_start_time,coupon_type,publish,receive_count,start_time,use_count,end_time,coupon_img,publish_count,per_limit FROM sms_coupon
2020-07-10 10:21:41.399 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : ==> Parameters:
2020-07-10 10:21:41.417 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : <== Total: 0
返回结果:
{"msg":"success","code":0,"page":{"totalCount":0,"pageSize":10,"totalPage":0,"currPage":1,"list":[]}}
5、SpringCloud- Gateway 网关
1)简介
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而 spring cloud gateway 作为 Spring Cloud 官方推出的第二代网关框架,取代了 Zuul 网关。
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性,监控/指标和弹性等。
官方文档地址:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/
2)核心概念路由
Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.
断言
Predicate: This is a Java 8 Function Predicate. The input type is a Spring framework ServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.
过滤器
Filter: These are instances of Spring framework GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.
3)使用1、HelloWorld
创建模块 gulimall-gateway
引入依赖
org.springframework.cloud
spring-cloud-starter-gateway
开启服务注册发现 @EnableDiscoveryClient
配置 nacos 的注册中心地址
bootstrap.yml
spring:
application:
name: gulimall-gareway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: d6a49c61-7ff2-41fa-a2df-1d0783b118f6
group: dev
application.properties
server.port=88
spring.application.name=gulimall-gareway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
编写网关配置文件
application.yml
spring:
cloud:
gateway:
routes: # 数组
- id: baidu_route # 数组1
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route # 数组2
uri: https://www.qq.com
predicates:
- Query=url,qq
启动服务测试
http://localhost:88/hello?url=qq
http://localhost:88/hello?url=baidu
2、断言 (predicates)
3、过滤器 (filters)



