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. Java反射复习笔记

    目录 反射 获取反射的三种方式: Class对象的功能 获取 成员变量/成员变量们 获取 成员方法/成员方法们 获取构造方法们 获取全类名 Field:成员变量 Method:成员方法 Constru ...

  2. leetcode26:valid-palindrome

    题目描述 判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写 例如:"A man, a plan, a canal: Panama"是回文 &quo ...

  3. 庐山真面目之三微服务架构Consul版本实现

    庐山真面目之三微服务架构Consul版本实现 一.简介           在上一篇文章<庐山真面目之二微服务架构NGINX版本实现>中,我们已经探讨了如何搭建基于Nginx 网关的微服务 ...

  4. Python基础学习之常用模块

    1. 模块 告诉解释器到哪里查找模块的位置:比如sys.path.append('C:/python') 导入模块时:其所在目录中除源代码文件外,还新建了一个名为__pycache__ 的子目录,这个 ...

  5. 转载:java web 项目中如何设置项目打开的默认页面

    通过博客学到的两种方法总结: 一.在web.xml文件中加入: 此时项目打开的默认页面就是loginS.html 二.在WebContent文件夹下添加index.jsp文件,此时这个index.js ...

  6. python_socket_tcp_文件传输

    server.py import json import struct import socket # 接收 sk = socket.socket() # sk.bind(('127.0.0.1',9 ...

  7. QQ群web前端分析二——第一印象

    对QQ群WEB进行前端分析 入口是 http://qun.qzone.qq.com/ 以下为第一印象,主要是从我的理解上找问题. ----------------------------------- ...

  8. PHP-Parse 简介以及在 Hyperf 中的应用

    介绍 PHP-Parse 是分析 PHP 代码生成 AST 的库,分析出可读性很高的对象数据结构,方便后续的更新和遍历. PHP-Parse 的主要作用是修改原有代码(比如插入自定义的代码片段),生成 ...

  9. c# 自动更新程序

    首先看获取和更新的接口 更新程序Program.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Diagno ...

  10. Flink Native Kubernetes实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...