项目结构创建
功能模块 | 数据库名称 | 服务端口 |
---|---|---|
coupon | sms | 7000 |
member | ums | 8000 |
order | oms | 9000 |
product | pms | 10000 |
ware | wms | 11000 |
码云新建仓库-----选择.gitignore为maven-----开源许可证为Apache-----生产/开发模型
创建微服务模块
group:com.atguigu.gulimall
artifact: gulimall-product
(同步 name)
package: com.atguigu.gulimall.product
导入必要的spring web
和 spring cloud下的openfeign
进行互相调用
创建其他的几个模块
1、父工程的pom.xml文件,模块名 组织名 packaging
modules
(进行聚合很多模块)
maven 添加pom.xml,发现了root标识
2、修改总项目的gitignore文件
在左下角的unversioned files
未版本控制刷新数量,写
**/mvnw **/mvnw .cm **/mvn **/target .idea **/.gitignore
添加到VCS,22个文件
安装gitee插件,commit到本地,取消右边的执行代码分析和检查TODO,commit and push
数据库初始化
数据库字符集选 utf8b4
,兼容utf8,并解决字符乱码问题
人人fast 复制进gulimall中,并把fast项目中的.git
文件删去,对应的数据库gulimall_admin
在application_dev.yml
中修改数据库的账号、密码信息
人人fast项目顺利运行
为了前端项目,下载安装node node -v
npm 是nodeJS的包管理工具,类似于maven----java
配置npm使用淘宝镜像
npm config set registry http://registry.npm.taobao.org/
npm install 下载所需的组件
发现报错,解决来源于 码云项目中的issues
谷粒商城 p16 node-sass报错最简单解决方法:
npm install 第一次报错后,再运行
npm install node-sass@npm:sass --ignore-scripts
完了直接npm run dev,成功
python啥的完全不需要
npm run dev
逆向工程搭建使用
下载人人代码生成器,.git
文件删去
人人fast,人人生成都加入modules
先生成gulimall-product
模块
1、appliation.yml 连接数据库,更改账号、密码
2、generator.properties 更改
包名=com.atguigu.gulimall.product
moduleName=product
mainPath=com.atguigu
表前缀=pms_
启动,粘贴main
创建新的maven模块,gulimall-common
继承,不放入module中(聚合)
导入 mybatis-plus-boot-starter
依赖
人人io.util中复制2个类到com.atguigu.common.utils
中,重新导入文件引用
org.apache.http.HttpStatus
依赖 httpComponent
人人pom.xml中的commons-lang
还有SQLFilter复制到类,constant,
servelet-api <scope>provided</scope>
shiro 的 @RequirePermissions 注解取消(生成器的template模板中,重新生成)
最后common中是
utils: constant PageUtils Query R RRException
XSS: HTMLFilter SQLFilter
配置测试微服务基本curd功能
整合mybatis-plus
1、导入依赖 mybatis-plus-boot-starter
;导入数据库驱动 mysql connect
2、在application.yml中配置数据库相关配置
spirng:datasource: username:root password:root
url:jdbc:msyql://192.168.56.10:3306/gulimall_pms
dirver_class_name:com.msyql.jdbc.driver
3、main主类中添加注解
@MapperScan("com.atguigu.gulimall.product.dao")
4、告诉mybatis-plus,sql映射文件位置,application.yml中
classpath后面的*标识不止扫描自己的类路径,包括依赖的jar包
mybatis-plus:mapper-locations:classpath*:/mapper/**/*.xml
同时配置主键自增
mybatis-plus:global-config:db-config:id_type:auto
测试
@Autowired BrandService brandService
@Test
public void contextLoads(){
brandEntity;
brandEntity.setName();
brandService.save(brandEntity)
sout("保存成功")
}
再测一个
List<brandEntity> list = brandService.list(new QueryWrapper<brandEntity>().eq("brand_id",1))
list.forEach(item->{sout(item);})
为了用nacos,在common中引入 spring-cloud-alibaba管理依赖,(github来源),注意跟springboot的版本对应
nacos注册中心
集群指10台机器跑用户服务
分布式指整个商城的订单服务、用户服务等不同模块协调工作
分布式中的每一个节点,都可以做集群,而集群不一定是分布式
**解释:**A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,哪些是正常的,哪些服务已经下线。解决这个问题可以引入注册中心。服务一上线注册到注册中心。如果某些服务下线,我们其他人可以实时感知到其他服务的状态,从而避免调用不可用的服务。
github—discovery example
1、导入客户端依赖 spring-cloud-starter-alibaba-nacos-discovey
2、在application.properties配置 nacos发现的服务地址,服务名
高版本nacos还要用户名和密码,都为nacos,用于鉴权
spring.cloud.nacos.discovery.server_addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
3、主启动类使用 @EnableDiscoveryClient
注解开启服务发现与注册功能
4、下载nacos server(来源是github),运行命令 startup.cmd -m standalone
,默认的是集群cluster
模式,改成单机模型
5、输入地址 127.0.0.1:8848/nacos
openfeign远程调用
1、引用 open-feign。
已知在gulimall-coupon Controller中
@RequestMapping("/member/list")
public R memeberCoupons(){
new CouponEntity;
setCouponName("满100减10")
return R.ok().put("coupons",Arrays.asList(couponEntity))
}
2、编写一个接口,告诉springcloud这个接口需要调用远程服务。声明接口的每一个方法都是调用远程服务的哪个请求
在gulimall-member dao 目录同级新建 feign ,新建接口interface(路径名称补全)
@FeignClient("gulimall-coupon")
@RequestMapping("/coupon/coupon/member/list")
public R memeberCoupons();
3、开启远程调用功能。gulimall-member中主启动类,引用包名
@EnableFeignClients(basePackages="com.atguigu.gulimall.member.feign")
4、使用时,membercontroller中,
@Autowired
CouponFeignService couponFeignService;
R c = couponFeignService.memeberCoupons();
return R.ok().put("member",memberEntity).put("coupons",c.get("coupons"))
nacos配置中心
**解释:**每一个服务最终都有大量的配置,并且每个服务都可以部署在多台机器上。
我们需要经常变更配置,可以让每个服务在配置中心获取自己的配置
而配置中心用来集中管理微服务的配置信息。
1、引入客户端依赖 spring-cloud-starter-alibaba-nacos-config
2、新建 bootstrap.properties > application.yml > application.properties
在bootstrap.properties
配置 nacos的服务地址,服务名
spring.cloud.nacos.config.server_addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
如果报错的话,写用户名、密码等。
ps.bootstrap.properties先获取到nacos配置地址,如果将上面的信息放到 application.properties中,无法读取nacos配置文件。
在coupon模块中,,加入application.properties有user.name=zhangsan
在couponController.java中获取配置的属性值,
@Value("${user.name}")
private String name;
在下面的R.ok().put("name",name)
3、在配置列表新建配置。控制台输出的信息中,要求会获取gulimall_coupon.properties文件。配置格式是.properties
更改后,发现是否会动态改变(观察前端返回的数据)
4、动态获取配置(热更新)。在CouponController类(即value注解所在的类)中加注解@RefreshScope
另一种属性加载方式是:其实现了自动刷新
private string name;
其类上写 @ConfigurationProperties(prefix="user") 约定大于配置
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
先读配置中心文件,再读项目中的application.properties。
命令空间与配置分组
命令空间,用来隔离配置。默认public。比如,创建dev
开发环境,test
测试环境,prop
生产环境
在bootstrap.properties中可以用 ...config....namespace=uuid
切换命名空间
每一个微服务互相隔离配置,每一个微服务都创建自己的命令空间,只加载自己命名空间下的所有配置。
不同namespace下的服务不可见
比如,coupon,优惠系统。
配置集:所有配置的集合,也就是一个配置文件。
配置ID:类似于文件名,, DataID 文件名
group:分组。如,在生产环境中再分组,不同的活动,618,1212
加载多配置集
如coupon模块,在nacos管理中新建datasource.yml,格式为yaml;mybatis.yml;other.yml
在bootstrap.properties中可以用
spring.cloud.nacos.config.ext=config[0].data_id=
.group=
.refresh= 是否动态刷新
网关gateway
类似于common,创建gateway模块,并进行nacos配置中心和注册发现。创建gateway命名空间。
断言表示:如果uri等于baidu,则跳转
spring:cloud:gateway:routes:
-id:test_route
uri:https://www.baidu.com
predicates:
- Query=url,baidu