1 spring cloud alibaba
1.1 简介
spring cloud alibaba的github地址:https://github.com/alibaba/spring-cloud-alibaba
1.2 引入依赖
在common模块里引入依赖
对应版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
- 2.2.x 版本适用于 Spring Boot 2.2.x
- 2020.x 版本适用于 Spring Boot 2.4.x
- 2021.x 版本适用于 Spring Boot 2.6.x
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.3 nacos 注册中心
1.3.1 引入依赖
在common模块里引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.3.2 下载nacos
安装在windows上
双击bin目录里的startup.cmd即可启动服务
输入http://localhost:8848/nacos/进入nacos页面
默认用户名密码都是nacos
1.3.3 配置nacos地址
在gulimall-coupon里配置nacos的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
还要设置服务名称
spring.application.name=gulimall-coupon
1.3.4 开启服务注册与发现功能
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
1.3.5 启动gulimall-coupon
启动gulimall-coupon,进入nacos页面查看服务是否注册成功
1.3.6 注册剩余服务
将其他几个服务按照同样的方法进行注册
1、修改application.yml
2、添加@EnableDiscoveryClient
注解
1.4 openfeign
1.4.1 引入依赖
之前已经引入了
1.4.2 远程调用步骤
- 引入openfeign
- 编写一个接口,告诉springcloud这个接口要调用远程服务
- 声明接口的方法是调用哪个远程服务的哪个请求
- 开启远程调用功能:@EnableFeignClients
1.4.2 远程调用实现
1、在coupon模块的CouponController.java下编写一个controller
@RequestMapping("/member/list")
public R memberCoupons() {
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons", Arrays.asList(couponEntity));
}
2、在member模块下创建一个feign.CouponFeignService.java
接口
@FeignClient("gulimall-coupon") // 告诉springcloud要调用哪个服务
public interface CouponFeignService {
// 告诉springcloud要调用该服务的哪个方法
@RequestMapping("coupon/coupon/member/list")
public R memberCoupons();
}
3、在member的MemberController.java里创建测试方法
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
}
4、在member模块的主启动类上标注注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
5、重新启动member和coupon服务
坑:member服务启动报错No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
问题原因:
由于Spring Cloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错.
解决方法:
加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
6、浏览器输入http://localhost:8000/member/member/coupons,看到JSON串则表示测试成功
1.5 nacos 配置中心
1.5.1 导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.5.2 创建bootstrap.yml
坑:不知道是不是版本问题,写bootstrap.properties无法连接到nacos
解决方法:
1、在common添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
2、在coupon模块下编写bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: localhost:8848
1.5.3 新建nacos配置
1.5.4 编写测试controller
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private String age;
@GetMapping("/test")
public R test() {
return R.ok().put("name", name).put("age", age);
}
coupon.user.name和coupon.user.age是从nacos上获取的
1.5.5 动态刷新配置
在CouponController类上标注@RefreshScope
1.5.6 命名空间
一般创建方法:
- 开发、测试、生产来命名
- 以每一个微服务的名称来命名
配置格式:
spring.cloud.nacos.config.namespace=xxx
1.5.7 group
配置格式:
spring.cloud.nacos.config,group=xxx
1.5.8 配置分类方法
每一个微服务创建自己的命名空间,使用group区分环境(test、dev、prod)
1.5.9 多配置集
把不同类型的配置区分开来,放到不同的文件中
1、数据源配置(命名空间:gulimall-coupon)
2、mybatis配置
3、其他配置
4、修改bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: d658a478-b874-4c7a-a9c0-5a7548a3034e
group: dev
extension-configs:
- dataId: datasource.yaml
group: dev
# 动态刷新
refresh: true
- dataId: mybatis.yaml
group: dev
# 动态刷新
refresh: true
- dataId: other.yaml
group: dev
# 动态刷新
refresh: true
5、现在可以注释掉application.yml里的所有内容,启动coupon服务,输入网址http://localhost:7000/coupon/coupon/test进行测试
1.6 gateway
1.6.1 新建gatewat模块
导入gateway依赖
依赖common模块
1.6.2 配置
1、开启服务注册发现,添加@EnableDiscoveryClient,并排除DataSource相关配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
2、配置nacos地址,application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
3、在nacos里新建命名空间gateway
4、新建配置
5、配置bootstrap.yml
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: bfe5c423-248e-4d55-89f9-56b4e2aa75d4
6、配置网关逻辑,application.yml
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url, baidu # 如果参数url的值为baidu,则页面跳转至https://www.baidu.com
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url, qq
7、启动主程序类
8、浏览器输入http://localhost:88/?url=qq观察到页面跳转至腾讯网
application.yml
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url, baidu # 如果参数url的值为baidu,则页面跳转至https://www.baidu.com
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url, qq
7、启动主程序类
8、浏览器输入http://localhost:88/?url=qq观察到页面跳转至腾讯网