Eureka实现服务注册与发现(二)

一. Eureka介绍

Eureka是Netflix开源的服务注册发现组件,是一个基于REST的服务,Spring Cloud Eureka是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,提供了Eureka Server服务端与 Eureka Client客户端,服务端即Eureka服务注册中心,系统中的其他服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,客户端完成微服务向Eureka服务的注册与发现。客户端同时也具备一个内置的使用轮询(round-robin)负载算法均衡器。在微服务启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server与 Eureka Client的关系图如下:

1. Eureka Server 是服务端,负责管理各个微服务注册与发现。

2. 在服务上添加Eureka Client代码,就会访问到Eureka Server将此微服务注册在Eureka Server中,从而使服务消费方能够找到。

3. 微服务(服务消费者)需要调用另一个微服务(服务提供者)时,从Eureka Server中获取服务调用地址,进行远程调用。

二. 搭建集群版Eureka 服务注册中心

为了避免Eureka Server的失效,Eureka Server高可用环境需要部署两个及以上Eureka Server,它们互相向对方注册。

2.1 创建两个Eureka Server模块

2.1.1 项目结构,两个服务注册中心的构建类似

   

2.2.2 配置pom.xml

<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>
  <parent>
    <groupId>com.dsx</groupId>
    <artifactId>springcloud-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../springcloud-parent/pom.xml</relativePath>
  </parent>
  <artifactId>springcloud-eureka</artifactId>
  <dependencies> 
  <!-- 导入Eureka-server 服务端依赖 --> 
  	<dependency> 
  		<groupId>org.springframework.cloud</groupId> 
  		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
   </dependency> 
  </dependencies>
</project>

2.2.3 配置主启动类

package com.dsx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer  //标识一个Eureka Server服务注册中心
public class EurekaServerApp_6001 {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApp_6001.class, args);
	}
}

 2.2.4 配置2台Eureka Server服务端的yml文件

          6001服务端模块的application.yml

server:
  port: 6001
eureka:
  instance:
# eureka服务端的实例名称
    hostname: eureka6001.com
  client:
# 服务注册,false表示不将自已注册到Eureka服务中
    registerWithEureka: false
# 服务发现,false表示自己不从Eureka服务中获取注册信息
    fetchRegistry: false
# Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
    serviceUrl:
#单机版 
#      defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群版: 配置其他的Eureka Server服务端访问地址
       defaultZone: http://eureka6002.com:6002/eureka/

        6002服务端模块的application.yml

server:
  port: 6002
eureka:
  instance:
# eureka服务端的实例名称
    hostname: eureka6002.com
  client:
# 服务注册,false表示不将自已注册到Eureka服务中
    registerWithEureka: false
# 服务发现,false表示自己不从Eureka服务中获取注册信息
    fetchRegistry: false
# Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
    serviceUrl:
#单机版
#      defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群版: 配置其他的Eureka Server服务端访问地址,多个地址以逗号分隔
      defaultZone: http://eureka6001.com:6001/eureka/

2.2.5 将服务提供者注册到2台Eureka Server集群中

基于REST风格的实现,此处只介绍服务提供者的application.xml 

server:
  port: 8002

mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
  type-aliases-package: com.dsx.domain # 所有Entity别名类所在包
  mapper-locations: classpath:mybatis/mapper/**/*.xml       # mapper映射文件

spring:
  application:
    name: microservice-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver             # mysql驱动包
    url: jdbc:mysql://127.0.0.1:3306/springcloud_db01?serverTimezone=GMT%2B8&characterEncoding=utf-8  # 数据库名称
    username: root
    password: 数据库密码
    dbcp2:
      min-idle: 5                                # 数据库连接池的最小维持连接数
      initial-size: 5                            # 初始化连接数
      max-total: 5                               # 最大连接数
      max-wait-millis: 150                       # 等待连接获取的最大超时时间
eureka:
  client:
# 服务注册开关  开启
    registerWithEureka: true
# 服务发现开关
    fetchRegistry: true
# 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
    serviceUrl:
#集群版 Eureka服务注册中心
       defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
#单机版 Eureka服务注册中心
#      defaultZone: http://localhost:6001/eureka
    instance:
       instanceId: ${spring.application.name}:${server.port}#指定实例ID,就不会显示主机
       preferIpAddress: true#访问路径可以显示IP地址

服务提供者的pom文件

<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>
  <parent>
    <groupId>com.dsx</groupId>
    <artifactId>springcloud-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../springcloud-parent/pom.xml</relativePath>
  </parent>
  <artifactId>springcloud-eureka-provider-8002</artifactId>
   <dependencies>
        <dependency>
            <groupId>com.dsx</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>
		<!-- 导入Eureka客户端的依赖,将 微服务提供者 注册进 Eureka --> 
		<dependency> 
			<groupId>org.springframework.cloud</groupId> 
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
		</dependency>
        <!--springboot web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- mybatis 启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
    </dependencies>
  
</project>

父工程的pom文件

<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.dsx</groupId>
  <artifactId>springcloud-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
   <module>springcloud-api</module>
   <module>springcloud-consumer</module>
   <module>springcloud-eureka</module>
   <module>springcloud-eureka-provider-8002</module>
   <module>springcloud-eureka-6002</module>
  </modules>
  
   <!-- spring boot 采用 2.0.7 版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <!-- spring cloud 采用 Finchley.SR2 版本 -->
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>


    <!--依赖声明-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <!--maven不支持多继承,使用import来依赖管理配置-->
                <scope>import</scope>
            </dependency>
            <!--导入 mybatis 启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--druid数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.12</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.13</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
   
</project>

2.2.6 先启动2个Eureka Server集群(6001,6002)

      访问地址:

         http://eureka6001.com:6001/

        http://eureka6002.com:6002/
再启动服务提供者 (8002)

至此简单的Eureka Server的集群就完成了,在搭建项目时,首先要思路清晰,知道每个模块需要实现什么功能及它如何才能实现此功能。在具体代码操作时,还要注意yml文件的格式,避免不必要的错误。Eclipse搭建父子工程可参考博客:https://blog.csdn.net/duan196_118/article/details/104323889

yml语法:

   大小写敏感

   使用缩进表示层级关系

   缩进时不允许使用Tab键,只允许使用空格。

   缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

   #表示注释,从这个字符一直到行尾,都会被解析器忽略。

 如有不同意见,欢迎留言指正。望不吝赐教!!!

发布了132 篇原创文章 · 获赞 1 · 访问量 7280

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/104334723