【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。

🍎个人主页:Meteors.的博客

💞当前专栏: 微服务

✨特色专栏: 知识分享

🥭本文内容:【1.4】Java微服务:服务注册和调用(Eureka+Ribbon)

📚 ** ps ** : 阅读这篇文章如果有问题或者疑惑,欢迎各位在评论区提问或指出!


----------------------------------------------------- 目录 ----------------------------------------------------------

目录

一、介绍

[1. 问题](#1. 问题)

2.关于Eureka的介绍

介绍:

组成:

[3. 关于Ribbon的介绍](#3. 关于Ribbon的介绍)

介绍

常见的Ribbon负载均衡策略

二、相关代码的实现

[1. 搭建Eureka服务](#1. 搭建Eureka服务)

[1) 导入依赖](#1) 导入依赖)

2)在主函数内开启Eureka注解​编辑

3)编写yml文件

4)进入服务中心

5)页面说明

[2. Eureka服务注册](#2. Eureka服务注册)

1)导入服务端依赖

2)在yml文件中,添加配置

3)添加多个服务

4)简单的使用

3.Ribbon的使用


--------------------------------------------------------------------------------------------------------------------------------

一、介绍

1. 问题

在介绍Eureka与Ribbon实现服务注册和调用功能之前,我们需要先回答一些问题:

1)微服务的远程调用,在使用注册中心之前,是怎么实现的?

一种比较多的方式是通过HTTP请求实现,像前端一样访问另一个服务的接口。

而具体的实现方式,像通过通过SpringBoot框架内的RestTemplate组件,发送HTTP请求到其他接口,实现代码如下:

java 复制代码
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        // 2.1.url路径
        String url = "http://localhost:8081/user/" + order.getUserId();
        // 2.2.发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

j结果截图:

2)使用restTemplate的方式进行微服务的远程调用,会哪些缺点?

  1. 首先,使用restTemplate不能解决许多微服务的许多问题。如服务的管理,服务调用的的负载均衡实现、发生故障或下线的即时处理

2.关于Eureka的介绍

介绍:

  • Eureka是Netflix开源的一个用于服务发现和注册中心的组件。它是基于RESTful风格的微服务框架,主要用于在分布式系统中管理和监控服务实例的状态。
  • 服务管理:Eureka允许服务在启动时向注册中心注册自己的信息,并周期性地发送心跳来更新状态。
  • 其他服务可以通过查询注册中心来获取可用服务的信息,以实现服务的调用和负载均衡。

组成:

  • EurekaServe: 服务端,注册中心
    • 记录服务信息
    • 心跳监控
  • EurekaClient: 客户端
    • Provider: 服务提供这,例如案例中的user-service
      • 注册自己的信息到EurekaServe
      • 每隔20秒向EurekaServer发送心跳请求
    • consumer: 服务消费者,例如案例中的order-server
      • 根据服务名称从EureksServer拉取服务列表
      • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

3. 关于Ribbon的介绍

介绍

  • Ribbon 是SpringCloud的其中一个组件,用于实现客户端负载均衡。它提供了负载均衡、故障转移和重试等功能,可以与服务注册中心(如 Eureka)集成使用。
  • 通过使用 Ribbon,可以实现负载均衡的客户端,使服务消费者能够可靠高效的访问多个服务提供者
  • Ribbon 提供了各种负载均衡策略,如轮询、随机、加权随机等,开发者可以根据需求选择合适的策略。

常见的Ribbon负载均衡策略

  1. **RoundRobinRule:**简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡策略。
  2. **AvailabilityFilteringRule:**对两种服务器进行忽略:
    1. 在默认情况下。这台服务器如果3次连接失败,这台服务器就会被设置为"短路"状态。短路状态持续20秒,如果再次连接失败,短路的持续时间就会几何级地增加。
    2. 并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数上限,可以由客户端的<clientName><clientConfigNameSpace>.ActiveConnectionsLimit属性进行设置。
  3. **WeightedResponseTimeRule:**为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
  4. **ZoneAvoidanceRule:**以区域可用的服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内多个服务做轮询。
  5. **BestAvailableRule:**忽略哪些短路的服务器,并选择并发数较低的服务器。
  6. **RandomRule:**随机选择一个可用的服务器。
  7. **RetryRule:**重试机制的选择逻辑

二、相关代码的实现

1. 搭建Eureka服务

1) 导入依赖

java 复制代码
        <!--eureka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

2)在主函数内开启Eureka注解

3)编写yml文件

java 复制代码
server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

4)进入服务中心

5)页面说明

2. Eureka服务注册

1)导入服务端依赖

在服务模块(如userServiece)的pom文件中导入:

java 复制代码
        <!--eureka客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2)在yml文件中,添加配置

userService的配置文件中:

orderService的配置文件中:

3)添加多个服务

=

4)简单的使用

3.Ribbon的使用

在服务中自定义负载均衡注解:

最后,

后续文章会陆续更新,希望文章对你有所帮助..!

参考文献:

Spring CloudLevel up your Java code and explore what Spring can do for you.https://spring.io/projects/spring-cloud/

09-Eureka-搭建eureka服务_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p=11&spm_id_from=pageDriver&vd_source=d0dc59eeb02e4e4b81ee32c868da3cfe

相关推荐
m0_571957581 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生3 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2343 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程3 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk4 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*4 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go