SpringCloud快速入门学习(一)之服务注册与发现——Netflix Eureka

前言

在这篇文章介绍并记录如何搭建一个单节点Eureka以及高可用的Eureka服务。

根据springcloud官方文档描述

Spring Cloud为开发人员提供了一些工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、群集状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算(Cloud Foundry)等托管平台。

微服务架构

微服务架构是一种将单个应用程序拆分多个单个应用组成的服务,每个服务为独立的业务开发独立部署,分布式管理。

SpringCloud Eureka

服务发现是基于微服务架构的关键原则之一。尝试手动配置每个客户机或某种形式的约定可能很难做到,而且可能很脆弱。Eureka是Netflix服务发现服务器和客户端。服务器可以配置和部署为高度可用,每个服务器将注册服务的状态复制到其他服务器。

Eureka主要由两个组件组成
Eureka服务器

注解 @EnableEurekaServer
Eureka服务端用作服务注册中心。支持集群部署。

Eureka客户端。

@EnableDiscoveryClient
Eureka客户端是一个java客户端,用来处理服务注册与发现。

在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。

注解@EnableEurekaClient上和@EnableDiscoveryClient

@EnableEurekaClient有@EnableDiscoveryClient的功能,其实@EnableEurekaClient注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解。

一、搭建单节点应用
1.1 需要搭建的工程

父工程:用来管理springcloud版本,采用的是Greenwich.SR5,springboot为2.1.12版本。
子工程:用来注册Eureka服务
子工程:用来发现Eureka服务
目录为
创建maven工程Spring-cloud-parent
~~mi-eureka(父工程右键 new--》Module)
~~mi-user(同上)

1.1.1 父工程只需要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>com.mi</groupId>
    <artifactId>Spring-Coud-Example</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mi-eureka</module>
        <module>mi-user</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
    </parent>

    <properties>
        <spring-cloud.version>Greenwich.SR5</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>
1.2 创建eureka注册服务 子工程配置及依赖
1.2.1 子工程目录
image.png
1.2.2 配置EurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
1.2.3 配置application.yml
spring:
  application:
    name: mi-eureka
server:
  port: 8000
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: false
    register-with-eureka: false    #因为自己就是服务中心    所以不需要注册
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.2.4 配置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">

    <!-- 指定父pom, 在父pom中配置子模块的公共依赖 -->
    <parent>
        <artifactId>Spring-Coud-Example</artifactId>
        <groupId>com.mi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <packaging>jar</packaging>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mi</groupId>
    <artifactId>mi-eureka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 模块名及描述信息 -->
    <name>mi-eureka</name>
    <description>Spring Cloud Eureka</description>

    <!-- eureka server: 提供服务发现与服务注册 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <!--
    SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
    SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
1.2.5 启动 EurekaApplication

启动服务并访问地址:localhost:8000

image.png
1.3 创建user服务发现子工程配置及依赖

工程包目录结构同上

1.3.1 配置DiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
1.3.2 配置application.yml

使用的ORM 是基于hibernate的JPA。

server:
  port: 9001
  servlet:
    context-path: /mi-user
spring:
  application:
    name: user
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
    properties:
      hibernate.format_sql: true
    open-in-view: false
    database-platform: org.hibernate.dialect.MySQL5Dialect
  datasource:
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 123456
      url: jdbc:mysql://127.0.0.1:3306/scloud?characterEncoding=utf-8&useSSL=false
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/
1.3.3 配置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">
    <parent>
        <artifactId>mi-user</artifactId>
        <groupId>com.mi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mi</groupId>
    <artifactId>user-server</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <!-- 引入 Web 功能 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--
            Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等
            Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除
        -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        <!-- Java Persistence API, ORM 规范 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- 数据库连接 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
            <scope>runtime</scope>
        </dependency>
        <!-- apache 提供的一些工具类 -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
    </dependencies>

    <!--
       SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
       SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
    -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
1.3.4 启动 UserApplication

启动服务并访问地址:localhost:9001
对于红色的字体,只是在检查服务的安全,可以不用理会


image.png

二、搭建高可用Eureka服务

2.1 在Eureka 工程y#ml 上 添加多个服务

注释之前的

#spring:
#  application:
#    name: mi-eureka
#server:
#  port: 8000
#eureka:
#  instance:
#    hostname: localhost
#  client:
#    fetch-registry: false
#    register-with-eureka: false    #因为自己就是服务中心    所以不需要注册
#    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server1
server:
  port: 8000
eureka:
  instance:
    hostname: server1
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server2:8001/eureka/,http://server3:8002/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server2
server:
  port: 8001
eureka:
  instance:
    hostname: server2
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/,http://server3:8002/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server3
server:
  port: 8002
eureka:
  instance:
    hostname: server3
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/,http://server2:8001/eureka/
2.2 对项目进行打包

在父工程目录下进行打包命令

mvn clean package -Dmaven.test.skip=true -U
打包成jar包

2.3 修改本地hostname

在此之前修改本地的hostname,以免服务名重复冲突。
演示 win 10
在 C:\Windows\System32\drivers\etc下的hosts文件,进行编辑,添加如下

微服务 本地发现

127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3

2.4 打开3个cmd窗口,到打包jar下的目输入命令

在此演示是方法项目录是生成的target下的jar包


image.png

三个cmd窗口依次输入

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server1

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server2

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server3

2.5 访问地址端口

访问 localhost:8000


image.png
3 总结
  • @EnableEurekaServer @EnableEurekaClient
  • 心跳检测、健康检查、负载均衡等功能
  • Eureka的高可用,生产上建议至少两台以上
  • 分布式系统中、服务注册中心是最重要的基本部分

以上就是本篇文的内容,觉得不错就给个赞呗。
后为持续更新记录。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容