Eureka注册中心


大家好,接着上一篇讲,假如我们的服务提供者user-service部署了多个实例,如图:

image-20230130113812407

大家思考几个问题:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

这些都需要注册中心来解决,像远程调用我们也需要解决掉这种硬编码的形式,因为同一个微服务可能会有多个实例,端口又都不一样

image-20230130114039906

1.搭建Eureka注册中心

首先我们应该知道,注册中心它本身是完成服务注册的功能的,保证微服务来它这里拿其他微服务来使用,所以它本身也是一个独立的微服务,在启动时也会将自己注册进自己的注册中心

所以我们先来创建一下这个微服务

1.创建eureka-service服务

image-20230130114602040

image-20230130114731700

2.引入eureka依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3.编写启动类

这里选择Server这个不要选错了,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

image-20230130115058500

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class);
    }
}

4.编写配置文件

application.yml

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

5.启动服务

访问http://localhost:10086

我们看到eureka把自己注册进去了

image-20230130120121344

2.服务注册

我们的eureka注册中心已经搭建好了,这个时候我们尝试把更多的服务注册进去让其管理

在注册进eureka之前我们先要引入依赖让用户服务变为客户端注册进eureka

1.引eureka-client依赖

将依赖引入user-service的pom文件中

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

复制user-service,再启动一个用户服务实例

image-20230130120525070

修改端口,临时属性会覆盖掉配置属性

image-20230130120725042

2.配置user-service的配置文件

修改application.yml文件,添加服务名称eureka地址

server:
  port: 8081
spring:
  application:
    name: userservice # 服务名称
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: Mysql.123
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
# 添加eureka地址,这个地址我们在创建注册中心时配置有,可以直接复制过来,防止出错
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

3.启动实例

image-20230130121821802

访问http://localhost:10086/

image-20230130121906228

没有order-service是因为我们没有对其因依赖并配置,找不到注册中心,所以它没办法注册进eureka。

3.实现远程调用与负载均衡

我们在上步没有将order-service注册进eureka,所以我们也调用不了注册中心的微服务,如果想调用需要将order-service也注册进去

步骤和上面的一样

1.引依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.配置文件

server:
  port: 8080
spring:
  application:
    name: orderservice
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: Mysql.123
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

重启order-service服务

image-20230130122753698

3.服务拉取与负载均衡

我们的任务还是希望order-service调用user-service服务,这个时候user-service实例有两个,以后在开发过程中可能会有更多,我们就需要考虑实现负载均衡了,以此来减小服务器的压力并且使用户获得更好的体验

但是这些都不需要我们做,只需要几个注解就可以实现

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

image-20230130123149029

这个时候我们就可以让order-service去调用user-service并且实现了负载均衡,但是我们这个时候还存在一个问题,就是order-service调用user-service是硬编码url不能实现从注册中心来拿服务的目的,所以需要解决硬编码问题

怎么解决?很简单,这个时候就需要用我们刚才写的服务名称配置了,服务名称是唯一的,这就可以作为我们取注册中心拿服务的唯一依据,修改后如下↓↓↓↓↓↓

image-20230130123704335

spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。

重启服务启动,进行访问调用

image-20230130123843488

image-20230130123831385

成功的调用,user键值对也有数据

接下来我们来验证下@loadbanlance这个注解是否帮我们实现了负载均衡,怎么验证?

很简单,我们将访问的地址刷新个十次或者五六七八次都可以,看看我们调用user-service服务是否两个实例都有被调用,如果都被调用说明实现了负载均衡,如果只调用了一个实例说明没有实现

image-20230130124034858

我这里刷新了六次

然后两个实例的情况如下,分别为三次,实现了负载均衡

image-20230130124308832

image-20230130124328707

4.负载均衡的配置

我们上面不仅实现了注册也实现了调用,目的已经达到,但是我们在最后实现负载均衡时,大家也可以尝试下,就是你刷新六次两个实例分别访问了三次,刷新十次两个分别访问五次,这其实就是负载均衡策略中的轮询方案,默认是轮询的

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

image-20230130124953993

不同规则的含义如下:

image-20230130124940174

我们自己也可以对负载均衡的策略进行配置有两种方式

1.代码方式

在order-service中的OrderApplication类中,定义一个新的IRule:

@Bean
public IRule randomRule(){
    return new RandomRule(); //随机访问策略
}
2.配置文件方式

在order-service的application.yml文件中,添加新的配置也可以修改规则:

userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

5.饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

该配置写在消费者配置中即order-service配置中

ribbon:
  eager-load:
    enabled: true  #开启饥饿加载
    clients: userservice #饥饿加载的微服务

未开启饥饿加载时我们调用user-service耗时

第一次访问耗时最长

image-20230130125943092

再刷新一次耗时明显变短

image-20230130130025255

开启饥饿加载重启服务

image-20230130130119976

第一次访问

image-20230130130339385

第二次访问

image-20230130130359215

我们很容易发现第一次访问时快了不少,这就是饥饿加载的好处,但是默认是进行懒加载的,我们需要自己开启

好了,各位大哥,这就是eureka的简单使用了包括注册中心搭建、服务注册、服务调用、负载均衡…
感谢观看,点个赞小弟很感谢φ(>ω<*) 小弟会持续输出~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊佩萁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值