微服务架构专题二:Spring-Cloud组件:eureka 及搭建eureka集群

一、eureka是什么?

eureka是Netflix的子模块之一,也是一个核心的模块,eureka里有2个组件,一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,另一个便是EurekaClient(我们的微服务)它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。

二、与spring-cloud的关系:

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

角色关系图:

在这里插入图片描述

三、如何使用?

在spring-cloud项目里面加入依赖:

1、eureka服务端配置

eureka服务端添加依赖:

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

eureka服务端项目里面加入以下配置:

server:
  port: 3000
eureka:
  server:
    enable-self-preservation: false    #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000   #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: localhost

  client:
    register-with-eureka: false #不把自己作为一个客户端注册到自己身上
    fetch-registry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka


然后在spring-boot启动项目上 加入注解:@EnableEurekaServer 就可以启动项目了

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

启动项目:如果看见这个图片,那么说明你就搭建好了:
在这里插入图片描述
这个警告只是说你把他的自我保护机制关闭了

2、客户端配置

eureka客户端添加依赖:

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

eureka客户端配置:

server:
  port: 5000
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:3000/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
  instance:
    instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30(与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

spring:
  application:
    name: client-user #此实例注册到eureka服务端的name

然后在客户端的spring-boot启动项目上 加入注解:@EnableEurekaClient 就可以启动项目了

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

直接来看效果图:
在这里插入图片描述

如果客户端是集群该如何配置咧:
对比一下配置,服务集群的话需要将注册的服务名称spring.application.name设置为一样,然后将eureka.instance.instance-id此实例注册到eureka服务端的实例ID设置为不一样即可:
在这里插入图片描述

效果图如下:
在这里插入图片描述

四、eureka集群

eureka集群原理

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务
提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从
本地缓存中取,完成一次调用。

eureka集群配置

刚刚我们了解到 Eureka Server会将注册信息向其他Eureka Server进行同步 那么我们得声明有哪些server呢?
这里 假设我们有3个Eureka Server 如图:
这里为了方便,我Server-Eureka配置了3个配置文件,启动时分别选择不同的配置文件,即可启动相应的Eureka服务
在这里插入图片描述

现在怎么声明集群环境的server呢? 我们看一张图:
在这里插入图片描述

可能看着有点抽象,我们来看看具体配置:

这里 方便理解集群 我们做了一个域名的映射(条件不是特别支持我使用三台笔记本来测试。。。) 至于域名怎么映
射的话 这里简单提一下吧 修改你的hosts文件(win10的目录在C:\Windows\System32\drivers\etc,Mac在/etc/hosts文件中修改,
自行百度一下把)附上我的hosts文件:

127.0.0.1 eureka3000.com
127.0.0.1 eureka3001.com
127.0.0.1 eureka3002.com

1、配置1(application.yml):

server:
  port: 3001
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3001.com


  client:
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3002.com:3002/eureka
      

2、配置2(application-3001.yml):

server:
  port: 3001
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3001.com


  client:
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3002.com:3002/eureka
      

3、配置3(application-3003.yml):

server:
  port: 3002
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: leureka3002.coms


  client:
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3001.com:3001/eureka
      

我们回到主题, 我们发现 集群配置与单体不同的点在于 原来是把服务注册到自己身上,而现在是注册到其它服务
身上
至于为什么不注册自己了呢?,回到最上面我们说过,eureka的server会把自己的注册信息与其他的server同步,
所以这里我们不需要注册到自己身上,因为另外两台服务器会配置本台服务器。(这里可能有点绕,可以参考一下
刚刚那张集群环境的图,或者自己动手配置一下,另外两台eureka的配置与这个是差不多的,就不发出来了,只要
注意是注册到其他的服务上面就好了)

当三台eureka配置好之后,全部启动一下就可以看见效果了:

在这里插入图片描述

当然,我们这里仅仅是把服务端配置好了, 那客户端怎么配置呢? 话不多说,上代码:
服务端只有eureka.client.serviceUrl.defaultZone这里的配置与单机eureka不同

server:
  port: 5000
eureka:
  client:
    serviceUrl:
        defaultZone: http://eureka3000:3000/eureka/,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
  instance:
    instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30(与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

spring:
  application:
    name: client-user #此实例注册到eureka服务端的name
    

原来是注册到那一个地址上面,现在是要写三个eureka注册地址,但
是不是代表他会注册三次,因为我们eureka server的注册信息是同步的,这里只需要注册一次就可以了,但是为
什么要写三个地址呢。因为这样就可以做到高可用的配置:打个比方有3台服务器。但是突然宕机了一台, 但是其
他2台还健在,依然可以注册我们的服务,换句话来讲, 只要有一台服务还建在,那么就可以注册服务,这里 需要
理解一下。

启动后效果图如下:
在这里插入图片描述

五、安全验证

到目前为止,服务注册中心的页面是可以公开访问的,可以加入安全验证使得访问更安全。
1、导入依赖:

        <!-- 安全验证 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        

2、添加配置:

spring:
  security:
    user:
      name: admin
      password: 123456
      

3、重新访问,输入账号和密码
在这里插入图片描述

以上均为***鲁班学院***学习资料,欢迎大家报班学习,真心推荐!

发布了143 篇原创文章 · 获赞 49 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/weixin_36586564/article/details/103887318