一、搭建环境
创建五个模块
1、gulimall-member(会员模块)
2、gulimall-order(订单模块)
3、gulimal-product(商品服务模块)
4、gulimall-ware(仓储服务模块)
5、gulimall-coupon(优惠卷模块)
引入spring-web和openfeign的依赖
整合MybatisPlus
1、导入数据源
2、配置
1、配置数据源:
(1)、导入数据库的驱动
(2)、在application.yml配置数据源相关信息
2、配置MyBatis-Plus
使用@MapperScan
告诉Mybatis-Plus,Sql映射文件的位置
mybatis-plus:
config-location: classpath:/mapper/**/*.xml
eg:
spring:
datasource:
username: root
password: "20020630"
url: jdbc:mysql://192.168.205.128:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
config-locations: classpath:/mapper/**/*.xml
#统一配置id主键自增
global-config:
db-config:
id-type: auto
利用逆向工程生成相关代码
进行相关接口测试
二、将微服务添加到nacos注册中心中
common模块导入alibaba.cloud
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
导入nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
添加配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#服务名称
application:
name: gulimall-coupon
使用注解开启服务控制与发现
在微服务模块的启动类上
@EnableDiscoveryClient
已经注册到nacos中
将其他模块的微服务用同样的方法都注册到nacos中
三、OpenFein测试远程调用
测试:使得member(会员)模块能远程调用coupon模块(优惠卷)
在优惠卷模块的contoller中添加一个查询优惠卷的方法
在member模块的pom文件下添加远程调用依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@RequestMapping("/member/list")
public R memberCoupons(){
//使用假数据模拟
CouponEntity coupon=new CouponEntity();
coupon.setCouponName("满100减20");
return R.ok().put("coupons",coupon);
}
想要在会员模块远程调用这个方法
创建一个接口放在feign包下
使用@FeignClien指明要调用的服务名称
//注册中心中coupon的服务名
@FeignClient("gulimall-coupon")
public interface CouponFeinService {
//注意:这里要填路径全称
@RequestMapping("coupon/coupon/member/list")
public R memberCoupons();
}
开启远程调用
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
在contoller中添加一个测试方法
@Autowired
private CouponFeinService couponFeinService;
//远程调用优惠卷服务
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R r = couponFeinService.memberCoupons();
return R.ok().put("member",memberEntity).put("coupons",r.get("coupons"));
}
新版的spring-boot需要loadbalancer进行负载均衡
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.5.RELEASE</version> <!--不使用ribbon进行客户端负载均衡--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <!-- 使用loadbalancer进行客户端负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> <version>2.2.7.RELEASE</version> </dependency>
访问地址http://localhost:8000/member/member/coupons
四、从配置中心获取配置文件
在common包下导入
<!-- 配置中心做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
测试:
在coupon模块下创建bootstrap.properties(这个配置文件加载的优先级最高)
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
在本地resource创建application.properties
自定义两个数据
coupon.user.name=zhangsan
coupon.user.age=18
在controller中获取application配置文件中的内容
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private String age;
@RequestMapping("/test")
public R test(){
return R.ok().put("name",name).put("age",age);
}
访问localhost:7000/coupon/coupon/test
这样在工程中加载配置文件,修改起来非常麻烦
所有使用nacos管理配置文件
在nacos中创建一个配置文件gulimall-coupon
由于我的spring-boot版本高
需要导入
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.3</version> </dependency>
配置热更新
使用@RefreshScope注解开启动态更新配置文件
为每个微服务配置独立的命名空间
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
#配置命名空间为gulimall-coupon
namespace: 56b83f9e-eb52-4b48-b0ad-c31a3a46e709
为每个微服务配置分组,使用配置分组区分环境,dev,prod
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
#配置命名空间为gulimall-coupon
namespace: 56b83f9e-eb52-4b48-b0ad-c31a3a46e709
#设置分组为dev环境
group: dev
同时加载多配置集
微服务的任何配置信息,任何配置文件都可以放在配置中心中
将原来的applciation.yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
datasource:
username: root
password: "20020630"
url: jdbc:mysql://192.168.205.128:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
config-locations: classpath:/mapper/**/*.xml
#统一配置id主键自增
global-config:
db-config:
id-type: auto
server:
port: 7000
拆分出来
mybatis.yml
mybatis-plus:
config-locations: classpath:/mapper/**/*.xml
#统一配置id主键自增
global-config:
db-config:
id-type: auto
datasource.yml
spring:
datasource:
username: root
password: "20020630"
url: jdbc:mysql://192.168.205.128:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
other.yml
server:
port: 7000
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
修改bootstrap.yml使用 extension-configs同时加载多个配置文件
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
#配置命名空间为gulimall-coupon
namespace: 56b83f9e-eb52-4b48-b0ad-c31a3a46e709
#设置分组为dev环境
extension-configs:
- data-id: datasource.yml
group: dev
refresh: true #热更新
- data-id: mybatis.yml
group: dev
refresh: true
- data-id: other.yml
group: dev
refresh: true
- data-id: gulimall-coupon.properties
group: dev
refresh: true
五、Gateway
创建一个model名字为gulimall-gateway继承gulimall-common模块
引入gateway依赖
将gulimall-gateway添加到nacos注册中心中
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: 127.0.0.1
name: gulimall-gateway
server:
port: 88
在启动类上开启服务发现
@EnableDiscoveryClient
启动测试:
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
这是因为gulimall-gate中引入了mybatis的依赖
没有配置数据源导致报错
在启动类上添加排除即可
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
给网关添加一个断言
gateway:
routes:
- id: test_route
uri: https://www.baidu.com/
predicates:
- Query=url,baidu
当访问的参数url=baidu的时候会自动跳转到https://www.baidu.com/
测试:
http://localhost:88/?url=baidu