SpringCloud 之服务注册与发现(Eureka)

本文详细介绍了如何创建SpringCloud Eureka服务注册中心,包括单节点配置、权限认证、自我保护机制的开启和关闭,以及如何实现Eureka集群。同时,讨论了服务注册、自我保护机制的作用和Eureka集群的配置,确保高可用性。
摘要由CSDN通过智能技术生成

1 总工程项目

  创建 springcloud 总工程项目

2 Eureka

   创建 springcloud-eureka 模块。

2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.pky</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka</artifactId>

    <dependencies>
        <!--  springcloud begin      -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!--  springcloud end      -->
        <!--  springboot begin      -->
        <!--  权限认证     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!--  springboot end      -->
    </dependencies>
</project>

我这里的eureka 版本是 1.4.6.RELEASE。可以放在总工程中的 pom.xml 进行依赖管理。

2.2 application.yml
server:
  port: 7001

spring:
  application:
    name: springcloud-eureka
  ## 权限认证,来保证安全性。
  security:
    user:
      name: pkyShare
      password: 123456

eureka:
  instance:
    hostname: eureka7001 # eureka 服务端实例名称
  server:
    # 自我保护机制,默认true。打开后,心跳失败在15分钟内低于85%(renewalPercentThreshold)的服务,也不进行剔除。
    # 关闭后,主页提示:RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.
    enableSelfPreservation: true # 本地调试时可fasle关闭。但生产建议打开,可防止因网络不稳定等原因导致误剔除服务。
    renewalPercentThreshold: 0.85 # 默认85%
  client:
    # 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
    registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
    fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
    serviceUrl:
      # 配置其他 eureka 的地址,如果多台则逗号分隔。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2.3 权限认证配置类

  SpringSecurity 默认开启跨域保护。因此需要配置关闭跨域保护

/**
 * 权限认证配置类
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();  // 关闭跨域保护
        super.configure(http);
    }
}

如果不关闭,当启动其他服务进行注册时,会出现 com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 的异常。

2.4 启动类
@SpringBootApplication
@EnableEurekaServer // 表明自己是注册中心
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
2.5 启动测试

  浏览器输入 localhost:7001,然后输入账号密码 即可访问,如下:
在这里插入图片描述

如果启动时报如下错误,则说明SpringCloud 与 SpringBoot 版本不对应,查阅版本对照进行修改即可。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bootstrapImportSelectorConfiguration': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationPropertiesBean

3 服务注册进入 Eureka

  上述并没有任何服务注册进入 Eureka,因此先将服务提供者注册。

3.1 添加 pom.xml 中的依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
3.2 yml

  在 yml 中主要添加如下配置,具体其他配置参考创建 springcloud 总工程项目

server:
  port: 9001

spring:
  application:
    name: springcloud-provider9001
    
# eureka 配置
eureka:
  client:
    service-url:
      # eureka 服务端地址(即注册地址),若 eureka 开启了权限认证,则需要携带账号密码
      defaultZone: http://pkyShare:123456@localhost:7001/eureka/
3.3 启动类
@SpringBootApplication
@MapperScan(basePackages = "com.pky.springcloud.provider.mapper") //扫描 Mapper
@EnableEurekaClient // 表明自己是个 eureka 客户端,会自动注册到 eureka 服务端中
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}
3.4 启动测试

  将服务提供者启动后,会自动注册到 eureka 中。

在这里插入图片描述

可以发现已经注册了。

4 Eureka 自我保护机制

  当某一个服务不可用了,Eureka 不会立刻清理,依旧会对改服务的信息进行保存!

  默认情况下,如果 EurekaServer 在一定时间内没有接受到某个服务实例的心跳,EurekaServer 将会注销改实例(默认 90 秒)。但是当网络分区故障发生时,服务于 Eureka 之间无法正常通信,此时不应该注销改服务。Eureka 通过自我保护机制来解决这个问题。即 EurekaServer 节点在短时间内丢失过多客户端时,那么这个节点就会进入自我保护模式,EruekaServer 就会保护服务注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 EurekaServer 节点会自动退出自我保护模式。

  yml 中的 eureka.server 来配置自我保护模式。

5 Eureka 集群

5.1 DNS

  分别创建 springcloud-eureka2 和 springcloud-eureka3 模块,pom.xml 的依赖、启动类等信息和上述的一致。然后修改 C:\Windows\System32\drivers\etc 路径下的 hosts 文件,文末添加三行,进行自定义 DNS

127.0.0.1       localhost
127.0.0.1       eureka7001.com	
127.0.0.1       eureka7002.com
127.0.0.1       eureka7003.com
5.2 yml

  主要是对 serviceUrl.defaultZone 进行添加多个注册地址。

  • 7001
server:
  port: 7001

spring:
  application:
    name: springcloud-eureka1
  security:
    user:
      name: pkyShare
      password: 123456

eureka:
  instance:
    hostname: eureka7001 # eureka 服务端实例名称
  client:
    # 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
    registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
    fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
    serviceUrl:
      # 配置其他 eureka 的地址,如果多台则逗号分隔。
      defaultZone: http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
  • 7002
server:
  port: 7002

spring:
  application:
    name: springcloud-eureka2
  security:
    user:
      name: pkyShare
      password: 123456

eureka:
  instance:
    hostname: eureka7002 # eureka 服务端实例名称
  client:
    # 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
    registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
    fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
    serviceUrl:
      # 配置其他 eureka 的地址,如果多台则逗号分隔。
      defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
  • 7003
server:
  port: 7003

spring:
  application:
    name: springcloud-eureka3
    
eureka:
  instance:
    hostname: eureka7003 # eureka 服务端实例名称
  client:
    # 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
    registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
    fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
    serviceUrl:
      # 配置其他 eureka 的地址,如果多台则逗号分隔。
      defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka,http://pkyShare:123456@eureka7002.com:7002/eureka
5.3 分别启动测试

  这样就成功了。
在这里插入图片描述

5.4 客户端服务端分别注册到集群
  • 修改客户端和服务端的配置
# eureka 配置
eureka:
  client:
    service-url:
      # eureka 服务端地址(即注册地址),若 eureka 开启了权限认证,则需要携带账号密码
      defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/,http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
  • 分别启动

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值