谷粒商城–注册中心配置中心及网关–笔记二
1.nacos注意
nacos启动报org.springframework.context.ApplicationContextException: Unable to start web server
因为nacos是默认的集群模式所以我们在startup.cmd里面第28行改成单机模式就好了
2.结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos: 注册中心(服务发现/注册)
SpringCloud Alibaba - Nacos: 配置中心(动态配置管理)
SpringCloud - Ribbon: 负载均衡
SpringCloud - Feign: 声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel: 服务容错(限流、 降级、 熔断)
SpringCloud - Gateway: API 网关(webflux 编程模式)
SpringCloud - Sleuth: 调用链监控
SpringCloud Alibaba - Seata: 原 Fescar, 即分布式事务解决方案
3.版本选择
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更, 且
spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更, 因此我们采取跟
SpringBoot 版本号一致的版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
4.项目中使用(服务注册中心)
1.项目中的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.将微服务注册到 nacos 中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.在应用的 /src/main/resources/application.yml配置文件中配置 Nacos Server 地址
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.157.129:3306/gulimall_sms
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
server:
port: 7000
4.使用@EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
5.启动应用, 观察 nacos 服务列表是否已经注册上服务
6.注册更多的服务上去, 测试使用 feign 远程调用
-
Nacos 使用三步
1、 导包 nacos-discovery
2、 写配置, 指定 nacos 地址, 指定应用的名字
3、 开启服务注册发现功能@EnableDiscoveryClient
-
Feign 使用三步
1、 导包 openfeign
2、 开启@EnableFeignClients 功能
3、 编写接口, 进行远程调用
5.open-feign使用
1.导包 openfeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在被调用的模块编写接口
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
}
3.在需要调用的模块开启@EnableFeignClients 功能
basePackages:用到远程调用的
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
4.在需要调用的模块调用
- 新建一个feign包,里面用来保存远程调用的接口
- 远程调用
/**
* 这是一个声明式的远程调用
*/
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
- 在调用模块controller使用
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@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"));
}
}
5.调用结果
http://localhost:8000/member/member/coupons
6.nacos作为服务配置中心
1.首先对nacos进行持久化,防止下次启动配置文件消失
- 进入
nacos-server-1.0.1\nacos\conf
目录,初始化文件:nacos-mysql.sql
- Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在
nacos-server-1.0.1\nacos\conf
目录下,名为application.properties
,在文件底部添加数据源配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
2.引入依赖
<!-- 配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.为需要统一管理配置的模块创建一个bootstrap.properties
spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
4.在配置中心添加配置
- 需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-member.properties。默认规则,应用名.properties
- 给 应用名.properties 添加任何配置
5.动态获取配置。
@RefreshScope:动态获取并刷新配置
@Value("${配置项的名}"):获取到配置。
注意:如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
@RefreshScope
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
CouponFeignService couponFeignService;
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test1(){
return R.ok().put("name",name).put("age",age);
}
}
访问测试http://localhost:8000/member/member/test
7.gateway网关
0.常用的断言
名称 | 描述 | 使用 |
---|---|---|
After Route Predicate | 在xx时间之前 | - After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] |
Before Route Predicate | 在xx时间之后 | - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] |
Between Route Predicate | 在时间范围之间 | - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai] |
Cookie Route Predicate | Cookie信息在正则表达式范围内 | - Cookie=username,zhangshuai #Cookie是username=zhangshuai才能访问 |
Header Route Predicate | Header信息在正则表达式范围内 | - Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式 |
Host Route Predicate | 请求主机地址在配置范围内 | - Host=**.baudu.com |
Method Route Predicate | 请求方法类型 | - Method=GET |
Path Route Predicate | 路径相匹配的进行路由 | - Path=/payment/lb/** |
Query Route Predicate | 查询参数在正则表达式范围内 | - Query=username, \d+ #要有参数名称并且是正整数才能路由 |
1.常用过滤器
2.引入gateway依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3.将网关服务注册到注册中心
application.properties配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
主启动类配置
@EnableDiscoveryClient
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
网关不需要数据库的情况下,又在common中引入了数据库的依赖加入下面配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
4.application.yml中配置网关规则
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
5.测试
http://localhost:88/?url=baidu
http://localhost:88/?url=qq