SpringCloud--第二章

七、配置集群

有了注册中心、有了客户端,现在我们需要考虑的是如果注册中心突然宕机了怎么办?

7.1、什么是集群

于是就有了集群这个概念,

集群的意思就是:配置多个注册中心,使这些注册中心相互关联,客户端向任意一个注册中心注册的信息,其他注册中心全部共享,这样的话即使一个注册中心宕机,其他的注册中心依旧可以使用

按照标题五的方法,我们在重新创建一个注册中心,为了区分这两个注册中心,一个地址以localhost命名 另一个以127.0.0.1来命名

注意:如果两个都是一样的名字,系统会默认他俩是一个注册中心,而不是两个

7.2、如何配置

这里说一下配置即可 因为要两个注册中心相互关联,所以我们在访问地址上 填上需要关联的注册中心即可

Eureka_7001

server.port=7001
#注册中心的名字
eureka.instance.hostname=localhost
# 是否将自己加载进注册中心
eureka.client.register-with-eureka=false
# 表示是否从Eureka Server获取注册的服务信息
eureka.client.fetch-registry=false
# 通过该url访问注册中心

# 单机情况下 注册中心绑定自己的地址   集群情况下 绑定其他集群的地址  中间用逗号隔开 
eureka.client.service-url.defaultZone=http://127.0.0.1:7002/eureka/

Eureka_7002

server:
  port: 7002
eureka:
  instance:
    hostname: 127.0.0.1
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://localhost:7001/eureka/

# 单机情况下 注册中心绑定自己的地址   集群情况下 绑定其他集群的地址  中间用逗号隔开

其他的7002与7001一模一样 相同配置即可

7.3、访问测试

先打开两个注册中心、然后打开生产者即可 然后进行访问
在这里插入图片描述
在这里插入图片描述

八、Eureka与zookeeper的区别

关系型数据 都遵循ACID原则

  • 事务的ACID原则 原子性一致性持久性隔离性

非关系型数据都遵循CAP原则

  • Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。

Eurekazookeeper都属于非关系型数据,所以都遵循ACP原则

不同点是:

  • zookeeper遵循CP原则,它不会立即响应数据的变化,总会有延迟,并且如果一个客户端宕机、它会立即注销这个客户端。如果有一个注册中心宕机,它会在内部重新推选出一个注册中心作为主的中心,但是在推选的这个时间内,所有的注册中心都是不可用的,一直到这个主的中心推选出来才可以。
  • Eureka遵循AP原则 它就恰恰与Zookeeper相反,它可以立即响应数据的变化,客户端宕机,它会将客户端挂起,而不是立即注销。一个注册中心宕机,不影响其他注册中心的使用

九、Ribbon实现负载均衡(客户端)

9.1、什么是负载均衡

如果要从注册中心拿到资源,怎么样才能做到所有注册中心都运作,以达到资源的高效利用?

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡*(Load Balance)*其意思就是分摊到多个操作单元上进行执行,例如Web服务器FTP服务器企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

换句话说就是,我们可以使用特定的算法策略,让用户可以在不同的服务提供者中拿到数据。

Ribbon就完美的拥有这些功能,他的默认算法是轮询,顾名思义,轮流查询 让每个服务提供者都有机会被访问

Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当我们将Ribbon和Eureka一起使用时,Ribbon会到Eureka注册中心去获取服务端列表,然后进行轮询访问以到达负载均衡的作用,客户端负载均衡也需要心跳机制去维护服务端清单的有效性,当然这个过程需要配合服务注册中心一起完成。

9.2、Pom依赖

由于是消费者要访问注册中心,所以就是要在消费者这里实现负载均衡,而新版的`spring-cloud-starter-netflix-eureka-client``集成了ribbon的功能 所有我们只需要在原有的消费者依赖中导这个依赖即可

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.8.0-beta0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.8.0-beta0</version>
        </dependency>

9.3、配置

和生产者一样 我们要配置它应该往哪一个注册中心去访问资源

#配置eureka
eureka:
  client:
    register-with-eureka: false  #不想rureka中注册自己
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://127.0.0.1:7002/eureka/
#告诉eureka往这两个地方访问数据

在RestTemplate配置类中添加注解@LoadBalanced让RestTemplate实现负载均衡

@Configuration

public class ConfigBean {
    @Bean
    @LoadBalanced//Ribbon实现RestTemplate负载均衡
    public RestTemplate getRestTemplate(){
        return   new RestTemplate();
    }
}

最后在主启动类加上注解@EnableEurekaClient 开启客户端的功能

9.4、模拟多数据源

为了清晰的看出负载均衡的成效,我们在原有的基础上添加两个生产者,并让他们连接不同的数据库,除此之外,所有的配置和生产者8001的配置一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn4KSs3e-1627806405324)(C:\Users\machenike\AppData\Roaming\Typora\typora-user-images\image-20210801142634310.png)]

9.4、启动测试

在这里插入图片描述
在这里插入图片描述

我们可以看到 我们的三个资源已经注册成功 现在使用消费者来访问这些请求

![)

我们可以看到 由于轮询的机制 我们请求了三次 它从三个不同的生产者中拿到了资源

十、使用Feign实现负载均衡

10.1、什么是feign

feign是另外一种负载均衡的方案,与Ribbon不同的是 Feign是面向接口编程的,它更符合我们程序员的思维。它将RestTemplate 的操作封装起来 我们可以更简单的使用它,通过我们熟悉的接口模式。并且 Feign已经集成了RestTemplate 我们不需要在对RestTemplate 进行实例化和Bean的注入了

10.2、Pom依赖

我们只需要在消费者的依赖中导入feign的依赖即可

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

10.3、接口编写

因为Feign是面向接口的负载均衡 所有我们需要编写一个Service接口

@Service
@FeignClient(value = "DeptProvider8001")
public interface DeptService {
    @GetMapping("/dept/getByid/{id}")
    Dept getByid(@PathVariable("id") Integer id);
     @GetMapping("/dept/getall")
    ArrayList<Dept> getall();
    @PostMapping("/dept/add")
    Boolean addDept(Dept dept);
}

在Service接口上添加@FeignClient(value = "DeptProvider8001")注解 表明这个接口被Feign所用

这里的Rest请求需要与生产者的请求一致

10.4、修改Controller

@RestController
public class DeptController {

//Feign集成了ribbon  实际上还是ribbon的操作 只不过Fegin封装了这些操作 使用面向接口的方式 使我们更好的接受 减少代码的冗余
    @Autowired
    private DeptService deptService=null;
    @RequestMapping("/consumer/dept/getByid/{id}")
    public Dept getByid(@PathVariable("id") Integer id){
        return this.getByid(id)   ;

    }
    @GetMapping("/consumer/dept/getall")
    public ArrayList<Dept> getall(){
        return this.getall();
    }
    @RequestMapping("/consumer/dept/add")
    public Boolean addDept(Dept dept){
        return this.addDept(dept) ;
    }
}

将原有的Ribbon繁琐的操作精简成Feign的操作

10.4、主启动类

按照常规操作 这个时候我们一定需要在主启动类上添加Enablexxxxx来开启某项服务

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.llf.Service"})
public class application {
    public static void main(String[] args) {
        SpringApplication.run(application.class,args);
    }
}

@EnableFeignClients(basePackages = {"com.llf.Service"}) 扫描这个包下的Feign注解 使其生效

然后测试 结果与Ribbon相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhvGwSoP-1627806405328)(C:\Users\machenike\AppData\Roaming\Typora\typora-user-images\image-20210801162225341.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值