基础概念
微服务
- 微服务就是将项目的各个模块拆分为可独立运行、部署、测试的架构设计风格。
分布式
- 不同的业务在不同的地方
集群
- 几台服务器集中在一起实现某种业务,(分布式每个节点都可以做集群,用户服务压力大分为10个)
远程调用
- 服务之间的相互调用,Http+Json
负载均衡
- 将请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
- 轮询, 线性轮询的方式依次选择每个服务实例
服务注册与服务发现?
- 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
- 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
配置中心
- 集中管理微服务配置信息
服务熔断和降级
- 降级 服务发生异常或调用超时,返回默认数据
- 熔断 某段时间失败次数太多了,触发熔断,拒绝全部请求
- 限流 最多允许n个请求访问
API网关
- 统一入口,动态路由,认证授权,令牌限流,负债均衡 ribbon,熔断限流 sentienl
- 统一认证,负债均衡,熔断限流,动态路由
微服务架构流程
- 前后分离开发
- 内网部署和外网部署,外网面向公众访问,部署前端项目(APP,PC);内网部署后端集群
- 前端页面发送请求到后端,经过Nginx集群,
- API网关(SpringCloud gateway)(动态态路由到指定的服务(商品服务) ,负载均衡(调用其中一台), 认证授权、(熔断降级,限流(sentinel)) )
- 到达服务(SpringBoot)
- 服务的相互调用(OpenFeign)
- 有些请求需要认证授权(OAuth2.0。SpringSecurity)
- 缓存使用Redis集群(分片+哨兵集群)。
- 持久化使用MySQL,读写分离和分库分表。
- 消息队列(RabbitMQ)异步解耦,分布式事务的一致性。
- 全文检索商品(ElasticSearch)
- 存取数据(阿里云的对象存储服务OSS)
- 快速定位问题,ELK处理日志,LogStash收集业务日志,ES存储,Kibana可视化页面从ES中检索出相关信息
- Nacos作为注册中心,(服务注册到注册中心)
- Nacos配置中心,(统一的动态配置,同步更改)
- 服务追踪,追踪服务调用链哪里出现问题(Sleuth、Zipkin、Metrics),把每个服务的信息交给开源的Prometheus进行聚合分析,再由Grafana进行可视化展示,提供Prometheus提供的AlterManager实时得到服务的告警信息,以短信/邮件的方式告知服务开发人员。
- 持续集成和持续部署。提交github,Jenkins打包成docker镜像,由k8s集成docker服务,将服务以docker容器的方式运行。
创建项目
- gav=gulimall,com.atguigu.gulimall,0.0.1-SNAPSHOT
创建5个Spring Initializr子module
- Group:com.atguigu.gulimall
- artifact:gulimall-coupon gulimall-member gulimall-order gulimall-product gulimall-ware
- package: com.atguigu.gulimall.coupon com.atguigu.gulimall.member
- com.atguigu.gulimall.order com.atguigu.gulimall.product com.atguigu.gulimall.ware
选中需要导入的依赖:
- Web:Spring Web ,Spring Cloud Routing:OpenFeign (微服务都需要调用与被调用)
快速创建相同模块,效率太慢废弃
- copy,paste项目,修改Name,Pom(artifactId,name,description),包名,点击+号加入maven管理,(一定要按住Shfit F6修改包名)
- 删除test,java下面的包
- 修改启动类
快速创建相同模块,效率太慢废弃
- copy,paste项目
- 全文搜索,Shift+Ctrl+F6,选择direct,替换product为coupon
- 单独替换包和类的文件名
建立新项目最快速方式
- Spring Initializr 设置 gav
聚合子模块,项目pom
- <packaging>pom</packaging>
- <modules><module></module></modules>
修改springboot+springcloud的版本,否则可能会报错
忽略mvn
**/mvnw
**/mvnw.cmd
**/.mvn
双击PDM打开PowerDesigner
- 双击打开表,字段的Name是备注,preview可以查看Sql语句
创建数据库
- gulimall_admin.sql,gulimall_oms.sql,gulimall_pms,gulimall_sms,gulimall_ums,gulimall_wms
- create database `gulimall_admin` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
人人开源作为后台前后端
- 人人开源
- git clone https://gitee.com/renrenio/renren-fast-vue.git
- git clone https://gitee.com/renrenio/renren-fast.git
3.1.renren-fast(后端)
- 1.clone到gulimall项目中,并删除.git文件
- 2.gulimall的pom文件配置该renren-fast模块 <module>renren-fast</module>
- 3.创建数据库gulimall-admin(基于db.mysql.sql文件)
- 4修改“application-dev.yml”文件,默认为dev环境,修改连接mysql的url和用户名密码 driver-class-name: url: username: root password: root
- 访问:http://localhost:8080/renren-fast/ admin,admin
3.2.renren-fast-vue(前端)
2.管理员身份打开vs-code,并打开文件夹renren-fast-vue
- 选中文件右键(集成终端打开)
- npm install #下载所有包
- npm run dev #启动
结构
- build/webpack.dev.conf.js,webpack配置文件,包含项目在开发环境打包和运行的相关配置
- static\config\index.js,api 访问接口
3.1.renren-fast(后端)
- 1.clone到gulimall项目中,并删除.git文件
- 2.gulimall的pom文件配置该renren-generator模块 <module>renren-generator</module>
- 3 修改“application.yml”文件,修改连接mysql的url和用户名密码 driver-class-name: url: username: root password: root
- 4.修改generator.properties【重复5遍】
代码生成器生成模块基础代码,修改generator.properties #配置信息
- mainPath=com.atguigu #主目录
- package=com.atguigu.gulimall #包名
- moduleName=product #模块名
- tablePrefix=pms_ #表前缀(类名不会包含表前缀)【java bean会去掉表前缀创建bean类】
生成各模块代码
- moduleName=product #模块名 使用包名+模块名拼接包名,resource下也会使用
- tablePrefix=pms_ #表前缀(类名去掉表前缀)
- 修改连接数据库
创建公共模块gulimall-common
- new module->maven->artifactid:gulimall-common
- 加入公共依赖 mybatisplus, lombok ,commons-lang(StringUtils), httpcore(R(http响应码)),mysql-connector-java(驱动),servlet-api
- 引入公共类,(renren-fast的utils包下的Query(查询),PageUtils(分页)、R(返回类)、Constant(常量),RRException(异常)
复制到utils,复制xss包(删除xss类)) - 各子模块引入common
修改代码生成器(generator)模板(模板文件在resource/template)
- 注释shiro注解RequiresPermissions
代码生成器生成模块基础代码,模块修改
- 删除resourc/src(前端代码)
所有模块整合mybatisplus
common模块引入依赖mybatisplus,mysql驱动
配置yml
- 配置数据源
- 配置mybatisplus(mapperxml路径location),主键自增(idtype)
配置@MapperScan注解 (右键copy Reference)(扫描dao(@Mapper)接口)
说明
- classpath* 扫描自己包下+引用jar包的类路径
书写技巧:
- 只用敲击配置属性最后一个英语字母会有智能提示
整合各模块
- 1 生成代码
- 2 引入common
- 3 整合mybatisplus
- 4 修改端口号
参考
Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目_哔哩哔哩_bilibili