Eureka实战(最通俗易懂)

7.Eureka学习

7.1 Eureka介绍

7.1.1认识Eureka

首先我们来解决第一问题,服务的管理。

问题分析

在刚才的案例中,provider对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦。

生活中的一个例子:网约车

这就好比网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个愿意给,就是缺少引子,缺乏管理。

此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴注册,记录你的车型(服务类型),身份信息(联系方式)。这样提供服务的私家车在滴滴那里都能找到,一目了然。

此时要叫车的人,只需要打开APP,输入你的目的地,选择车型(服务类型),滴滴自动安排一个符合需求的车到你面前,为你服务。

Eureka做什么?

Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。

同时,服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。

这就实现了服务的自动注册、发现、状态监控。

7.1.2基本架构

在这里插入图片描述

Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址

提供者:启动后向Eureka注册自己信息(地址,提供什么服务)

消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发 送给消费者,并且定期更新。

心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态

7.2 Eureka Server

7.2.1新建maven 工程eureka-server

pom.xml 中引入eureka-server依赖,pom文件如下

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edu.xja</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
    </properties>

    <dependencies>
<!--springcloud-->

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <!--springcloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
<build>
    <plugins>
        <!--springboot的maven插件-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>

application.yml 对注册中心进行配置

server:
  port: 8761                    # 指定该Eureka实例的端口

spring:
  application:
    name: euremka-server

# eureka server 配置
eureka:
  client:
    #是否将自己注册到注册中心
    registerWithEureka: false
    #是否从EurekaServer 获取注册信息
    fetchRegistry: false
    #设置与eureka交互的地址
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

edu.xja 包下编写启动类EurekaApplication

/**
 * 使用Eureka做服务发现.
 * @author Thomas
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
7.2.2 启动eureka server测试

访问http://localhost:8761/

在这里插入图片描述

7.3 Eureka Client

7.3.1修改模块microservice-provider-user

microservice-provider-user/pom.xml 文件中加入eureka-client 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
7.3.2配置注册中心信息

application.yml中添加

spring:
  application:
    name: user-provider

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
7.3.3启动microservice-provider-user

访问注册中心: http://localhost:8761/

在这里插入图片描述

7.4 Eureka Server的HA(高可用)

我们如果只配置一台注册中心(Eureka Server),就会出现SPOF(单点故障),如果Eureka Server发生宕机,就会影响注册到Eureka Server上的微服务,导致微服务不可用。

所以在生产环境中,通常会部署一个高可用的Eureka Server 集群。架构图如下:

在这里插入图片描述

7.4.1 编写高可用Eureka Server

Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server 实例会彼此增量的同步信息,从而确保所有节点数据一致。

事实上,节点之间的相互注册是Eureka Server的默认行为。

1.复制项目eureka-server 修改名字为eureka-server-ha

在这里插入图片描述

修改pom.xml 文件中的artifactId 为eureka-server-ha

在这里插入图片描述

  1. 配置系统的hosts

Ø Windows系统下的hosts文件路径是:C:\Windows\System32\drivers\etc\hosts

Ø Linux及Mac OS等系统的文件路径是:/etc/hosts

127.0.0.1 peer1 peer2

  1. 修改application.yml, 让两个节点互相注册
spring:
  application:
    name: microservice-eureka-server-ha

---
spring:
  profiles: peer1

server:
  port: 8761                    # 指定该Eureka实例的端口

eureka:
  instance:
     #指定profile=peer1 时,主机名是peer1
     hostname: peer1
  client:
    serviceUrl:
      #将自己注册到peer2这个Eureka上面
      defaultZone: http://peer2:8762/eureka/

---
spring:
  profiles: peer2

server:
  port: 8762                    # 指定该Eureka实例的端口

eureka:
  instance:
     hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

代码说明:

使用连字符(—)将application.yml 分成三段,第二段和第三段分别为spring.profiles设置了一个值,该值表示它所在的那段内容应用在哪个profile里。

第一段由于并未指定spring.profiles,因此这段内容会对所有profile生效。

  1. 打包
mvn clean package -Dmaven.test.skip=true
  1. 启动测试

    java -jar eureka-server-ha-1.0-SNAPSHOT.jar --spring.profiles.active=peer1
    java -jar eureka-server-ha-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
    

    或者可用命令-D,不过要在jar包之前

    java -jar -Dspring.profiles.active=peer1 eureka-server-ha-1.0-SNAPSHOT.jar 
    java -jar -Dspring.profiles.active=peer2 eureka-server-ha-1.0-SNAPSHOT.jar 
    

注意:启动第一台eureka-server时,console上会报错,因为它注册不到peer2

Peer2 还没有启动

在这里插入图片描述

浏览器分别访问8761端口和8762端口

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

7.4.2 将应用注册到Eureka Server 集群上

修改客户端microservice-provider-user,让客户端同时注册到多个注册中心。

client/application.yml

eureka:
  client:
    service-url:
       defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/  # 注意用逗号分开
#      defaultZone: http://localhost:8761/eureka/
#  instance:
#    prefer-ip-address: true

启动客户端Erueka Client (microservice-provider-user)

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

7.5用户认证

上面的示例中,Eureka server 是允许匿名访问的,实际项目中,可能希望必须经过用户认证才允许访问。

7.5.1 为Eureka Server 添加用户认证

将eureka-server项目复制一份eureka-server-security

在这里插入图片描述

修改pom文件中artifactId

在这里插入图片描述

使用idea 打开工程eureka-server-security

eureka-server-security/pom.xml 加入安全依赖spring-boot-starter-security,该依赖为Eureka server提供用户认证的能力。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

修改工程eureka-server-security下的application.yml,添加以下内容

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

修改application.yml中eureka.client.serviceUrl. defaultZone 为http://user:123456@localhost:8761/eureka/

edu.xja.config包下添加web配置信息类

@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    /**
     * 高版本springcloud的丢弃了配置:
     *
     * security:
     *   basic:
     *    enabled: true
     *
     * 所以应该使用以下方式开启
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
//注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
        // 如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

启动测试

在这里插入图片描述

输入用户名和密码可以登录

7.5.2 将微服务注册到需认证的Eureka Server

修改microservice-provider-user下的application.yml

eureka:
  client:
    service-url:
      defaultZone: http://user:123456@localhost:8761/eureka/

启动访问测试

启动测试

7.5.2 将微服务注册到需认证的Eureka Server

修改microservice-provider-user下的application.yml

eureka:
  client:
    service-url:
      defaultZone: http://user:123456@localhost:8761/eureka/

启动访问测试
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值