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

注意事项

  1. nacos不能和eureka一块用, nacos就是用来替代eureka的.
  2. 除了依赖和配置不一样之外, 其他用法, 两者没有任何区别.

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   # 设置组名(不同组之间数据隔离)

注意事项

  1. namespace必须在控制台提前创建, 设置时必须设置的是namespace的ID
  2. group不需要在控制台提前创建, 直接设置即可

Nacos的服务实例

概述

Nacos的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos和Eureka的区别

共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

不同点

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值