SpringCloud
什么是springcloud?
微服务是分布式架构的一种,而分布式是将服务进行拆分,再拆分的过程中会产生各种各样的问题。而cloud在当中解决的仅仅是服务治理问题
1.Eureka入门
1.1 服务端
- 导入Maven坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
-
yml配置
eureka: client: service-url: defaultZone: http://localhost:10086/eureka
-
开启@EnableEurekaServer注解
1.2 客户端
-
导入坐标
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
yml配置
eureka: client: service-url: defaultZone: http://localhost:10086/eureka
-
开启@EnableEurekaClient注解
-
启动多个实例配置
- 开启负载均衡
为什么通过其它服务名称能调用服务呢?查看LoadBalanced源码
通过LoadBalancerInterceptor
拦截RestTemplate请求,然后从eureka根据服务id拿到服务列表,然后根据负载均衡算法得到真实地址 替换服务id
创建负载均衡器,拿到列表集合
通过负载均衡算法选择server
继续跟进server方法
这里使用默认的轮询算法
自定义负载均衡策略
yml配置
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: userservice
2.Nacos入门
-
导入坐标
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
yml配置
spring: cloud: nacos: server-addr: localhost:8848
-
配置集群
spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ # 集群名称 -Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH 启动多个服务
-
配置负载均衡
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
-
Eureka和Nacos区别?
nacos对于临时结点采用心跳机制,对于非临时结点采用主动检测模式,非临时结点不会被剔除
nacos支持服务列表变更的消息推送模式,服务列表及时更新
nacos集群支持CP和AP,默认使用AP,当集群有非临时结点时使用CP,Eureka使用AP
-
config配置
<!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
添加bootstrap.yaml
spring: application: name: userservice # 服务名称 profiles: active: dev #开发环境,这里是dev cloud: nacos: server-addr: localhost:8848 # Nacos地址 config: file-extension: yaml # 文件后缀名
配置热更新
在@Value注入的变量所在类上添加注解@RefreshScope
或者添加一个配置类
@Component @Data @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; }
3.Feign入门
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@FeignClient("userserivce")
public interface UserServiceFeign {
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id);
}
启动类加上注解@EnableFeignClients
Feign性能优化
feign:
client:
config:
default:
loggerLever: BASIC #日志级别 只打印请求和响应数据
httpclient:
enabled: true #开启feign对httpClient的支持
max-connections: 200 #最大连接数
max-connections-per-route: 50 #每个路径的最大连接数
feign的底层客户端是URLConnection 是jdk自带的不支持连接池 那么就意味着每次请求都需要进行3次握手和4次挥手 很大的影响的性能
4.Gateway入门
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
gateway:
routes:
- id: order-service
uri: lb://orderservice # 负载均衡路由服务
predicates:
- Path=/order/** # 断言 根据请求路径匹配
filters: # 路由过滤器
- AddRequestHeader=Truth,Liubo666
globalcors:
add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
cors-configurations:
'[/**]':
allowedOrigns: # 允许哪些网站跨域请求
- "http://localhost:8083"
allowedMethods: #允许跨域的ajax请求方式
- "GET"
- "POST"
- "DELETE"
allowedHeaders: "*" #允许在请求中携带的头信息
allowCredentials: true #是否允许携带cookie
maxAge: 360000 #本次跨域的有效期