SpringCloud基础
声明: 本博客已标明出处,如有侵权请告知,马上删除。
核心前提
SpringCloud和SpringBoot版本之间有对应关系.
所以, 统一父工程要求.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<mysql.version>5.1.47</mysql.version>
<mybatis.version>2.1.1</mybatis.version>
</properties>
<dependencyManagement>
<dependencies>
<!--springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 全局依赖 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
远程调用-原始操作
注册RestTemplate
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
实现远程调用
// 1.定义请求url路径
String url = "http://localhost:8081/user/" + order.getUserId();
// 2.发送http请求,实现远程调用,并把返回的json字符串转换为User对象
User user = restTemplate.getForObject(url, User.class);
Eureka注册中心(了解)
概述
Eureka作为注册中心, 用来保存"微服务中的各个服务信息".
注意:
1.Eureka需要自己创建注册中心服务.
2.Eureka的注册中心服务也需要注册到Eureka中.
3.其他服务都属于Eureka的客户端服务
搭建eureka-server
创建eureka-server服务
创建naven项目,并继承父工程
引入eureka服务依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //开启eureka的注册中心功能
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
编写application.yml文件
server:
port: 10086 #当前服务的端口
spring:
application:
name: eureka-server # 当前服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka的地址(当前服务也需要注册到eureka)
启动服务
启动微服务,然后在浏览器访问:http://127.0.0.1:10086 查看eureka服务列表页面
服务注册
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置application.yml文件
server:
port: 8090 #当前服务的端口
spring:
application:
name: orderservice # 当前服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka的地址
注意事项
在微服务中, 每个服务, 即使"生产者"又是"消费者".
所以:
userservice和orderservice都需要注册到eureka.
端口号和服务名称要保证不重复
服务拉取
概述
所谓的服务拉取, 指的就是远程调用. 微服务的远程调用和远程调用的原始操作不同, 微服务的远程调用, 绑定的不再是IP, 而是服务名称.
修改RestTemplate
@Bean
@LoadBalanced //微服务远程调用-负载均衡. 必须配置,否则无法远程调用服务
public RestTemplate restTemplate() {
return new RestTemplate();
}
修改远程调用
// 1.定义请求url路径,该路径不再绑定IP,而是绑定服务名称
String url = "http://userservice/user/" + order.getUserId();
// 2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
Ribbon负载均衡(了解)
负载均衡策略
策略分类
其他信息
1.Ribbon默认的负载均衡规则就是ZoneAvoidanceRule.
2.短路: 在默认情况下,服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。
短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。
3.客户端的..ActiveConnectionsLimit属性可以配置并发连接数的上限.
4.权重: 服务器响应时间越长,这个服务器的权重就越小.
5.同区域: 可以理解为一个机房、一个机架等
3.所有策略都实现了IRule接口
修改负载均衡策略
方式1
// 直接创建对应的负载均衡策略对象
@Bean
public IRule randomRule(){
return new RandomRule();
}
方式2
userservice: # 在调用方, 给某个被调用者配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意,一般用默认的负载均衡规则,不做修改。
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 是否进行加载
clients: userservice #对什么服务进行饥饿加载
Nacos注册中心
概述
Nacos注册中心是国内用的比较多的, 比相比Eureka功能更加丰富的, 由是SpringCloudAlibaba推出的注册中心。
Nacos的注册中心是阿里巴巴提前做好的, 不需要我们自己创建, 但需要安装一下.
所有的微服务都作为Nacos的客户端存在.
服务注册到
加入依赖限定
<!--在父工程的pom文件中的`<dependencyManagement>`中引入SpringCloudAlibaba的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency
引入nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置nacos地址
spring:
cloud:
nacos:
server-addr: localhost:8848
注意事项
- nacos不能和eureka一块用, nacos就是用来替代eureka的.
- 除了依赖和配置不一样之外, 其他用法, 两者没有任何区别.
nacos服务分级
概述
Nacos的服务是分级存储的, 他的存储模型为:
服务 --> 集群 --> 实例
Nacos允许在服务中添加集群设置, 并可以实现, 消费者优先访问同集群内部的实例.
配置生产者的集群
# userservice的application.yml文件
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 给生产者, 也就是服务的提供方设置集群名称
同集群优先的负载均衡
给消费者配置集群信息
# orderservice的application.yml文件
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 给消费者, 也就是服务的消费方也设置集群名称
修改负载均衡规则
# orderservice的application.yml文件
userservice: # 给被调用者配置负载均衡规则
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
nacos环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有多个group、service等
- 不同namespace之间相互隔离.
- 同一namespace,但不同group之间相互隔离.
微服务配置namespace
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 设置集群
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 设置命名空间(不同命名空间之间数据隔离),填ID
group: abc # 设置组名(不同组之间数据隔离)
注意事项
- namespace必须在控制台提前创建, 设置时必须设置的是namespace的ID
- group不需要在控制台提前创建, 直接设置即可
Nacos的服务实例
概述
Nacos的服务实例分为两种类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos和Eureka的区别
共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
不同点
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式