1.Eureka简介

(1).CAP简介

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863?fr=aladdin

(2).Eureka简介

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

https://github.com/Netflix/eureka

2.Eureka原理

(1).Eureka原理

[1].Eureka原理简介

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

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

而系统中的其他微服务,使用 Eureka Client(Eureka客户端)连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka和Dubbo的架构对比

[2].Eureka组件

Eureka包含两个组件:Eureka Server和Eureka Client,Eureka Server提供服务注册服务;各个节点启动后,会在EurekaServer中进行注册,这样urekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也 具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。

(2).Eureka角色

Eureka Server 提供服务注册和发现。

Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到。

Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务。

(3).Eureka工程

总父工程

通用模块api

服务提供者Provider

服务消费者Consumer

3.Eureka架构步骤

(1).创建服务注册中心eureka

microservicecloud-eureka-7001 eureka服务注册中心Module

[1].新建工程

[2].配置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>microservicecloud</artifactId>

<groupId>com.hosystem</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>microservicecloud-eureka-7001</artifactId>

<dependencies>

<!--eureka-server服务端 -->

        <dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka-server</artifactId>

</dependency>

<!-- 修改后立即生效,热部署 -->

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

</dependencies>

</project>

[3].配合application.yml

server:

port: 7001

eureka:

instance:

hostname: localhost #eureka服务端的实例名称

client:

register-with-eureka: false #false表示不向注册中心注册自己。

fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

service-url:

defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

[4].EurekaServer7001_App主启动类

package com.hosystem.springcloud;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来

public class EurekaServer7001_App

{

public static void main(String[] args)

{

SpringApplication.run(EurekaServer7001_App.class, args);

}

}

[5].Eureka Test

http://localhost:7001/

No application available(没有服务被发现),因为没有注册服务进来当然不可能有服务被发现.

(2).注册eureka服务中心

microservicecloud-provider-dept-8001将已有的部门微服务注册进eureka服务中心。

[1].修改microservicecloud-provider-dept-8001

①.修改pom.xml

新添加的部分:

<!-- 将微服务provider侧注册进eureka -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-config</artifactId>

</dependency>

完整的部分:

<?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>microservicecloud</artifactId>

<groupId>com.hosystem</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>microservicecloud-provider-dept-8001</artifactId>

<dependencies>

<dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->

            <groupId>com.hosystem</groupId>

<artifactId>microservicecloud-api</artifactId>

<version>${project.version}</version>

</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>

<dependency>

<groupId>ch.qos.logback</groupId>

<artifactId>logback-core</artifactId>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jetty</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

</dependency>

<!-- 修改后立即生效,热部署 -->

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

        <!-- 将微服务provider侧注册进eureka -->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-eureka</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-config</artifactId>

        </dependency>

    </dependencies>

</project>

②.修改application.yml

新添加的部分:

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

完整的部分:

server:

  port: 8001

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.hosytem.springcloud.entities    # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

#name spring.application.name=microservicecloud-dept  很重要很重要很重要

spring:

   application:

    name: microservicecloud-dept

datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://192.168.188.188:3306/cloudDB01              # 数据库名称

    username: root

password: 123456

dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

③.修改DeptProvider8001_App主启动类

package com.hosystem.springcloud;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication

@EnableEurekaClient //本服务启动后会自动注册进eureka服务中

public class DeptProvider8001_App

{

public static void main(String[] args)

{

SpringApplication.run(DeptProvider8001_App.class, args);

}

}

[2].测试

①.启动EurekaServer

需要先启动EurekaServer在启动provider

②.启动DeptProvider 

③.显示效果

Application中MICROSERVICECLOUD-DEPT如何得到.

(3).actuator与注册微服务信息完善

[1].主机名称:服务名称修改

如何去掉主机名称

①.修改application.yml文件

修改microservicecloud-provider-dept-8001的application.yml文件。

修改部分:

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

  instance:

    instance-id: microservicecloud-dept8001

完整部分:

server:

  port: 8001

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.hosytem.springcloud.entities    # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

#name spring.application.name=microservicecloud-dept  很重要很重要很重要

spring:

   application:

    name: microservicecloud-dept

datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://192.168.188.188:3306/cloudDB01              # 数据库名称

    username: root

password: 123456

dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

instance:

    instance-id: microservicecloud-dept8001

②.显示效果

[2].访问信息有IP信息提示

如何设置访问信息有IP信息提示

①.修改applicaiton.yml

修改microservicecloud-provider-dept-8001的application.yml文件。

修改部分:

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

instance:

    instance-id: microservicecloud-dept8001

prefer-ip-address: true     #访问路径可以显示IP地址

完整代码

server:

  port: 8001

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.hosytem.springcloud.entities    # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

#name spring.application.name=microservicecloud-dept  很重要很重要很重要

spring:

   application:

    name: microservicecloud-dept

datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://192.168.188.188:3306/cloudDB01              # 数据库名称

    username: root

password: 123456

dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

instance:

    instance-id: microservicecloud-dept8001

prefer-ip-address: true     #访问路径可以显示IP地址

②.显示效果

[3].微服务info内容详细信息

如何配置服务报告info

①.修改microservicecloud-provider-dept-8001

修改microservicecloud-provider-dept-8001的Pom文件

修改部分:

<!-- actuator监控信息完善 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

完整部分:

<?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>microservicecloud</artifactId>

<groupId>com.hosystem</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>microservicecloud-provider-dept-8001</artifactId>

<dependencies>

<dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->

            <groupId>com.hosystem</groupId>

<artifactId>microservicecloud-api</artifactId>

<version>${project.version}</version>

</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>

<dependency>

<groupId>ch.qos.logback</groupId>

<artifactId>logback-core</artifactId>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jetty</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

</dependency>

<!-- 修改后立即生效,热部署 -->

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

<!-- 将微服务provider侧注册进eureka -->

        <dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-config</artifactId>

</dependency>

<!-- actuator监控信息完善 -->

        <dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

</dependencies>

</project>

②.修改父工程microservicecloud

总的父工程microservicecloud修改pom.xml添加构建build信息。

修改部分:

<!--构建的build信息-->

<build>

<finalName>microservicecloud</finalName>

<resources>

<resource>

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-resources-plugin</artifactId>

<configuration>

<delimiters>

<delimit>$</delimit>

</delimiters>

</configuration>

</plugin>

</plugins>

</build>

完整部分:

<?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.hosystem</groupId>

<artifactId>microservicecloud</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>pom</packaging>

<!--注:这行最开始创建的时候是不存在的-->

    <modules>

<module>microservicecloud-api</module>

<module>microservicecloud-provider-dept-8001</module>

<module>microservicecloud-consumer-dept-80</module>

<module>microservicecloud-eureka-7001</module>

</modules>

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

<log4j.version>1.2.17</log4j.version>

<lombok.version>1.16.18</lombok.version>

</properties>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>Dalston.SR1</version>

<type>pom</type>

<scope>import</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-dependencies</artifactId>

<version>1.5.9.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.0.4</version>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.0.31</version>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.0</version>

</dependency>

<dependency>

<groupId>ch.qos.logback</groupId>

<artifactId>logback-core</artifactId>

<version>1.2.3</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>${log4j.version}</version>

</dependency>

</dependencies>

</dependencyManagement>

<!--构建的build信息-->

    <build>

<finalName>microservicecloud</finalName>

<resources>

<resource>

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-resources-plugin</artifactId>

<configuration>

<delimiters>

<delimit>$</delimit>

</delimiters>

</configuration>

</plugin>

</plugins>

</build>

</project>

③.修改microservicecloud-provider-dept-8001

修改microservicecloud-provider-dept-8001的yml文件。

修改部分:

info:

  app.name: hosystem-microservicecloud

company.name: www.hosystem.com

build.artifactId: $project.artifactId$

build.version: $project.version$

完整部分:

server:

  port: 8001

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.hosytem.springcloud.entities    # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

#name spring.application.name=microservicecloud-dept  很重要很重要很重要

spring:

   application:

    name: microservicecloud-dept

datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://192.168.188.188:3306/cloudDB01              # 数据库名称

    username: root

password: 123456

dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

      defaultZone: http://localhost:7001/eureka

instance:

    instance-id: microservicecloud-dept8001

prefer-ip-address: true     #访问路径可以显示IP地址

info:

  app.name: hosystem-microservicecloud

company.name: www.hosystem.com

build.artifactId: $project.artifactId$

build.version: $project.version$

④.显示效果

(4).eureka自我保护

[1].效果演示

[2].现象原因

简单来说,某时刻某个微服务不可用,eureka不会立刻清理,依旧会对该微服务的信息进行保存。

[3].自我保护简介

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

  在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。

(5).服务发现Discovery

microservicecloud-provider-dept-8001服务发现Discovery。

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

[1].修改microservicecloud-provider-dept-8001

修改microservicecloud-provider-dept-8001工程的DeptController

修改部分:

//注:如果Autowired显示 could not autowired.there is more than one bean of 'DiscoveryClient' type; 使用一下两种方法都行

//方法1:那么只需要添加@Qualifier("discoveryClient")即可

//方法2::当然也可以修改成 private DiscoveryClient discoveryClient; 但是我们也需要修改discovery()方法中clientdiscoveryClient

@Qualifier("discoveryClient")

@Autowired

private DiscoveryClient client;

@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)

public Object discovery()

{

List<String> list = client.getServices();

System.out.println("**********" + list);

List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");

for (ServiceInstance element : srvList) {

System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"

                + element.getUri());

}

return this.client;

}

完整部分:

package com.hosystem.springcloud.controller;

import com.hosystem.springcloud.entities.Dept;

import java.util.List;

import com.hosystem.springcloud.service.DeptService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class DeptController

{

@Autowired

private DeptService service;

//注:如果Autowired显示 could not autowired.there is more than one bean of 'DiscoveryClient' type; 使用一下两种方法都行

    //方法1:那么只需要添加@Qualifier("discoveryClient")即可

    //方法2::当然也可以修改成 private DiscoveryClient discoveryClient; 但是我们也需要修改discovery()方法中clientdiscoveryClient

    @Qualifier("discoveryClient")

@Autowired

private DiscoveryClient client;

@RequestMapping(value = "/dept/add", method = RequestMethod.POST)

public boolean add(@RequestBody Dept dept)

{

return service.add(dept);

}

@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)

public Dept get(@PathVariable("id") Long id)

{

return service.get(id);

}

@RequestMapping(value = "/dept/list", method = RequestMethod.GET)

public List<Dept> list()

{

return service.list();

}

@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)

public Object discovery()

{

List<String> list = client.getServices();

System.out.println("**********" + list);

List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");

for (ServiceInstance element : srvList) {

System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"

                    + element.getUri());

}

return this.client;

}

}

[2].修改DeptProvider8001_App主启动类

package com.hosystem.springcloud;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication

@EnableEurekaClient //本服务启动后会自动注册进eureka服务中

@EnableDiscoveryClient

public class DeptProvider8001_App

{

public static void main(String[] args)

{

SpringApplication.run(DeptProvider8001_App.class, args);

}

}

[3].本地检测

①.启动EurekaServer

②.启动DeptProvider8001_App主启动类

③.启动DeptProvider8001_App主启动类

http://localhost:8001/dept/discovery

④.DeptProvider8001_App Console

[4].修改microservicecloud-consumer-dept-80

修改microservicecloud-consumer-dept-80工程的DeptController_Consumer

修改部分:

//测试@EnableDiscoveryClient,消费端可以调用服务发现

@RequestMapping(value="/consumer/dept/discovery")

public Object discovery()

{

return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);

}

完整部分:

package com.hosystem.springcloud.controller;

import com.hosystem.springcloud.entities.Dept;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController //:这里一定不能忘记注解@RestController 否则出现404;

public class DeptController_Consumer {

/**

     *  使用restTemplate访问restful接口非常的简单;

     *  (url, requestMap, ResponseBean.class)三个参数代表REST请求地址、请求参数、HTTP响应转换被转换成的对象类型

     */

    private static final String REST_URL_PREFIX = "http://localhost:8001";

@Autowired

private RestTemplate restTemplate;

@RequestMapping(value="/consumer/dept/add")

public boolean add(Dept dept)

{

return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);

}

@RequestMapping(value="/consumer/dept/get/{id}")

public Dept get(@PathVariable("id") Long id)

{

return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);

}

//@SuppressWarnings("unchecked"):压制警告,因为我们使用了过期的方法

    @SuppressWarnings("unchecked")

@RequestMapping(value="/consumer/dept/list")

public List<Dept> list()

{

return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);

}

//测试@EnableDiscoveryClient,消费端可以调用服务发现

    @RequestMapping(value="/consumer/dept/discovery")

public Object discovery()

{

return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);

}

}

/**

 *  JDBC    Spring JDBCTemplate

 *          Spring RestTemplate

 */

[5].显示效果

4.集群配置

(1).Eureka集群原理

上图是来自eureka的官方架构图,这是基于集群配置的eureka;

- 处于不同节点的eureka通过Replicate进行数据同步

- Application Service为服务提供者

- Application Client为服务消费者

- Make Remote Call完成一次服务调用

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

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

(2).新建工程

新建microservicecloud-eureka-7002/microservicecloud-eureka-7003

[1].新建microservicecloud-eureka-7002

[2].新建microservicecloud-eureka-7003

(3).配置pom文件

[1].eureka-7002 pom文件

配置microservicecloud-eureka-7002的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>microservicecloud</artifactId>

<groupId>com.hosystem</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>microservicecloud-eureka-7002</artifactId>

<dependencies>

<!--eureka-server服务端 -->

        <dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka-server</artifactId>

</dependency>

<!-- 修改后立即生效,热部署 -->

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

</dependencies>

</project>

[2].eureka-7003 pom文件

配置microservicecloud-eureka-7002的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>microservicecloud</artifactId>

<groupId>com.hosystem</groupId>

<version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>microservicecloud-eureka-7003</artifactId>

<dependencies>

<!--eureka-server服务端 -->

        <dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka-server</artifactId>

</dependency>

<!-- 修改后立即生效,热部署 -->

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

</dependency>

</dependencies>

</project>

(4).配置主启动类

[1].EurekaServer7003_App.java

package com.hosystem.springcloud;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来

public class EurekaServer7002_App

{

public static void main(String[] args)

{

SpringApplication.run(EurekaServer7002_App.class, args);

}

}

[2].EurekaServer7003_App.java

package com.hosystem.springcloud;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来

public class EurekaServer7003_App

{

public static void main(String[] args)

{

SpringApplication.run(EurekaServer7003_App.class, args);

}

}

(5).修改hosts文件

127.0.0.1  eureka7001.com

127.0.0.1  eureka7002.com

127.0.0.1  eureka7003.com

(6).配置application.yml

[1].配置eureka7001 application.yml文件

server:

port: 7001

eureka:

instance:

hostname: eureka7001.com #eureka服务端的实例名称

client:

register-with-eureka: false     #false表示不向注册中心注册自己。

fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

service-url:

#单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。

defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

[2].配置eureka7002 application.yml文件

server:

port: 7002

eureka:

instance:

hostname: eureka7002.com #eureka服务端的实例名称

client:

register-with-eureka: false     #false表示不向注册中心注册自己。

fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

service-url:

#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

[3].配置eureka7003 application.yml文件

server:

port: 7003

eureka:

instance:

hostname: eureka7003.com #eureka服务端的实例名称

client:

register-with-eureka: false     #false表示不向注册中心注册自己。

fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

service-url:

#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

(7).microservicecloud-provider-dept-8001

配置microservicecloud-provider-dept-8001的applicaiton.yml文件

server:

  port: 8001

mybatis:

  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径

  type-aliases-package: com.hosytem.springcloud.entities    # 所有Entity别名类所在包

  mapper-locations:

  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

#name spring.application.name=microservicecloud-dept  很重要很重要很重要

spring:

   application:

    name: microservicecloud-dept

datasource:

    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型

    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包

    url: jdbc:mysql://192.168.188.188:3306/cloudDB01              # 数据库名称

    username: root

password: 123456

dbcp2:

      min-idle: 5                                           # 数据库连接池的最小维持连接数

      initial-size: 5                                       # 初始化连接数

      max-total: 5                                          # 最大连接数

      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:

  client: #客户端注册进eureka服务列表内

    service-url:

#      defaultZone: http://localhost:7001/eureka

      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

instance:

    instance-id: microservicecloud-dept8001

prefer-ip-address: true     #访问路径可以显示IP地址

info:

  app.name: hosystem-microservicecloud

company.name: www.hosystem.com

build.artifactId: $project.artifactId$

build.version: $project.version$

(8).test

[1].启动eureka7001、eureka7002、eureka7003

在IDEA的Run Dashboard中运行eureka7001、eureka7002、eureka7003

[2].显示效果

5.Eureka和Zookeeper比较

作为服务注册中心,Eureka比Zookeeper好在哪里。

CAP:https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863?fr=aladdin

参考文档:https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863?fr=aladdin

https://github.com/Netflix/eureka

4、Spring Cloud Eureka的更多相关文章

  1. 一、 Spring Cloud Eureka ,咱们先跑起来

    一.Spring Cloud 简介 Spring Cloud 是一个基于Spring Boot 实现的微服务架构开发工具.是一个涉及到服务治理.分布式配置管理.负载均衡.服务容错.API网关.消息总线 ...

  2. 【Spring Cloud 系列】 二、Spring Cloud Eureka 的第一印象

    Eureka : 翻译翻译,找到了!(惊讶语气) Spring CLoud 中的 Spring Cloud Eureka,用于 分布式项目中的服务治理.是对Netflix 套件中的Eureka 的二次 ...

  3. 3、Spring Cloud - Eureka(构建服务端/客户端)

    3.1.Eureka简介 3.1.1.什么是 Eureka 和Consul.Zookeeper 类似, Eureka 是一个用于服务注册和发现的组件,最开始主要应用 于亚马逊公司旗下的云计算服务平台 ...

  4. 3、Spring Cloud - Eureka(高可用Eureka Server集群)

    在实际的项目中,可能有几十个或者几百个的微服务实例,这时 Eureka Server 承担了非 常高的负载.由于 Eureka Server 在微服务架构中有着举足重轻的作用,所以需要对 Eureka ...

  5. Spring Cloud Eureka Server使用(注册中心)

    一.Spring Cloud Eureka 基于Netflix Eureka做了二次封装 由两个组件组成 Eureka Server 注册中心, 供服务注册的服务器 Eureka Client 服务注 ...

  6. 1 Spring Cloud Eureka服务治理

    注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行 ...

  7. 一:Spring Boot、Spring Cloud

    上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...

  8. 一、Spring Cloud介绍

    springcloud 介绍 研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Clou ...

  9. spring cloud eureka高可用

    记录下自己踩的坑 spring cloud eureka的高可用网上的教程大致分为两种,一种是两两互相注册,一种是三个互相注册. 1.两两互相注册 普通服务的注册写法都是http://peer1/eu ...

随机推荐

  1. input 与 button 的问题 (空隙/不等高/对不齐)及 解决办法

    1. input 与 button 为什么有空隙? - 要明白为什么,需要了解一下几点基础知识(耐心看完,你会发现竟如此简单)     1. input 与 button 都属于行级块元素,都具有文本 ...

  2. leetcode5:insertion-sort-list

    题目描述 使用插入排序对链表进行排序. Sort a linked list using insertion sort. 示例1 输入 复制 {3,2,4} 输出 复制 {2,3,4} // 插入排序 ...

  3. os00

    - 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数# 操作系统* 进程和线程    * [进程和线程有什么区别?](#进程和线程有什么区别)    * [进程间通信有哪些方式?](# ...

  4. Aps.Net Core3.1 WebApi发送阿里云短信验证码

    1.前言 转眼又要过了一年了 好久没写博客了,人不学就要落后,今天有时间把以前弄的发送阿里云短信验证码登录记录一下. 2.准备条件 1)去阿里云官网注册一个账号.有账号直接登录就行,以前新人好像有免费 ...

  5. Windows自带MD5 SHA1 SHA256命令行工具

    感恩大佬LiuYanYGZ的文章 MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirs ...

  6. Vue3.0初体验

    最近看了Vue3.0的相关信息,相比Vue2.0有以下优点: Performance:性能更比Vue 2.0强. Tree shaking support:可以将无用模块"剪辑", ...

  7. 有了Cloud Alert电话报警,再也不怕遗漏告警了

    Cloud Alert 的部分应用部署在阿里云上,使用了多方面的监控服务: 阿里自身的ECS服务器和网站. Zabbix 监控服务器应用程序. OneAPM 的应用级监控. 腾讯云拨测,做网站监控. ...

  8. K最邻近分类

    最邻近分类是分类方法中比较简单的一种,下面对其进行介绍 1.模型结构说明        最邻近分类模型属于"基于记忆"的非参数局部模型,这种模型并不是立即利用训练数据建立模型,数据 ...

  9. explain命令---查看mysql执行计划

    引言: 实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因 ...

  10. 使用Camtasia制作冰雪奇缘视频

    冰雪奇缘的精良制作,以及场景的华丽,让很多女孩子都很喜欢.对于其中美丽的冰雪场景,我们还可以使用Camtasia(Windows系统)教程录制软件来做冰雪奇缘视频. Camtasia教程录制软件是一款 ...