SpringCloud使用
发起远程调用
根据订单id查询订单的同时,把订单所属的用户信息一起返回,但订单信息和用户信息分属两个不同的模块。
本质上是订单模块向用户模块发起请求,在spring中使用resttemplate发起。
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
搭建Eureka-server
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 在启动类上添加注解
- 添加配置文件
server:
port: 10086 # 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
注册客户端
- 引入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 编写配置文件
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
- 修改访问的路径,使用服务名代替ip+端口
- 添加负载均衡注解,使服务可以随机访问
Ribbon负载均衡
Ribbon负载均衡规则
Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则。
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 轮询index,选择index对应位置的Server |
AvailabilityFilteringRule | 检查status里记录的各个服务的状态,过滤掉一直连接失败和高并发的服务器 |
WeightedResponseTimeRule | 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低 |
ZoneAvoidanceRule | 默认的负载均衡策略,使用Zone对服务器进行分类,即复合判断Server所在区域的性能和Server的可用性,再对同一个Zone内做轮询 |
BestAvailableRule | 选择一个最小的并发请求的server,如果Server被tripped了,则跳过 |
RandomRule | 随机选择一个可用的服务器 |
RetryRule | 对选定的负载均衡策略加上重试机制,在一个配置时间段内当 选择Server不成功,则一直尝试使用subRule的方式选择一个 可用的Server |
Ribbon核心组件
ribbon的懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载.
,
Spring配置刷新
参考这篇文章学习了一遍
在修改代码的时候发现了如下问题:
application.yml配置文件内容如下:
server:
port: 8081
spring:
application:
name: userservice
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: ${spring.application.name}
group: DEFAULT_GROUP
datasource:
url: jdbc:mysql://127.0.0.1:3306/gotest?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
shardingsphere:
sharding:
default-database-strategy:
tables:
# discovery:
# cluster-name: HZ
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
#eureka:
# client:
# service-url: # eureka的地址信息
# defaultZone: http://127.0.0.1:10086/eureka
pattern:
name: 本地环境local
book:
author: haha
name: springcloudtest
category: category01
按照dataid的格式: ${prefix}-${spring.profiles.active}.${file-extension}
此处读取的nacos中配置的dataid应当为userservice.yaml
实际生效的为userservice.properties
控制台无输出。
修改properties文件
控制台有输出,且请求对应有变化。
GateWay中的11种路由断言工厂
注意事项
- nacos默认是以集群方式启动的,安装nacos之后直接启动会报如下错误
需要修改启动命令为:startup.cmd -m standalone
或者修改startup.cmd/startup.sh
:
# startup.sh删除
export MODE="cluster"
# 调整为
export MODE="standalone"
- 启动eurekaserver的时候还可能出现这样的错误
参考资料
- SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程
- SpringCloud 源码系列(9)— 负载均衡Ribbon 之 核心组件与配置
- 面试官:如何设计一个Ribbon负载均衡组件
- SpringCloud实践系列(二):Ribbon负载均衡
- nacos官方文档
- SpringCloud使用Nacos保存和读取变量的配置方法
- Spring Cloud Alibaba(三) 搭建API网关 gateway动态路由