SpringCloud学到刚好够用之二-服务注册发现Eureka.md

Posted by lizhao on 07-09,2019

SpringCloud学到刚好够用之二-服务注册发现Eureka

@[toc]

总览

spring cloud相关技术栈在现在各个互联网公司的普及率已经很高了,这次去面试,基本面试官都有提到这一块,但是有没有实际接触过,只能遗憾的摇摇头。这里记录下学习过程,将一些踩坑的经验写出来,供大家参考。这个系列只会写到很浅的一部分,如有兴趣深入,可以看"这个系列",将会给大家一个方向哈

基于SpringCloud的Greenwich.SR1,Jdk11,Maven,Idea开发

简介

Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来。 Eureka包含了服务器端和客户端组件。服务器端,也被称作是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。 客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。

服务端(注册中心)

主要步骤

  1. 新建项目
  2. 修改pom文件,这里要注意一个bug,就是cloud和boot之间的对应关系,对应关系如下,也可以看这篇文章
  3. 在application类中声添加注解EnableEurekaServer,声明是一个eureka项目
  4. 修改application.yml配置文件(端口号,注册中心地址),如果是properties文件则把 ":换行"改成".",把":"改成"="
  5. 启动Pro002EurekaApplication.main
  6. 简单测试,可以访问http://localhost:8761/

上述步骤关键代码及图片

  1. 新建项目
  2. 修改pom文件,这里要注意一个bug,就是cloud和boot之间的对应关系,对应关系如下,也可以看这篇文章
<?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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lizhaoblog.scl</groupId>
  <artifactId>pro002-eureka</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>pro002-eureka</name>
  <description>eureka project for Spring Cloud</description>

  <properties>
    <java.version>1.8</java.version>
    <!--
    springcloud和springboot的版本对应关系
    Table 1. Release train Spring Boot compatibility
    Release Train	Boot Version
    Greenwich 2.1.x(可用2.1.4.RELEASE)
    Finchley 2.0.x(可用2.0.5.RELEASE)
    Edgware 1.5.x
    Dalston 1.5.x
    -->
    <spring-cloud.version>Greenwich.BUILD-SNAPSHOT</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </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>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>spring-snapshots</id>
      <name>Spring Snapshots</name>
      <url>https://repo.spring.io/snapshot</url>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </pluginRepository>
    <pluginRepository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
    </pluginRepository>
  </pluginRepositories>

</project>

  1. 在application类中声添加注解EnableEurekaServer,声明是一个eureka项目
package com.lizhaoblog.scl.pro002eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 *  EnableEurekaServer: 声明是eureka服务中心
 *  SpringBootApplication: 声明是springboot项目
 */
@EnableEurekaServer
@SpringBootApplication
public class Pro002EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(Pro002EurekaApplication.class, args);
    }
}

  1. 修改application.yml配置文件(端口号,注册中心地址),如果是properties文件则把 ":换行"改成".",把":"改成"="
# 服务器配置(tomcat)
server:
  port: 8761 # 端口

# eureka相关配置
eureka:
  instance:
    hostname: localhost # 主机名称
  client:
    registerWithEureka: false # 表示自己不是客户端
    fetchRegistry: false
    serviceUrl: # 作为eureka服务端的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/


  1. 启动Pro002EurekaApplication.main
  2. 简单测试,可以访问http://localhost:8761/

测试:模拟某个服务,注册到eureka

主要步骤

  1. 新建项目
  2. 修改pom文件依赖
  3. 添加注解,声明是一个eureka客户端
  4. 修改application.yml配置文件
  5. 启动
  6. 回头看http://localhost:8761/网址,找找不同(可以在网页中搜索Instances currently registered with Eureka)。

上述步骤关键代码及图片

  1. 新建项目
  2. 修改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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lizhaoblog.scl</groupId>
  <artifactId>pro002-eureka-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>pro002-eureka-test</name>
  <description>eureka client for test eureka</description>

  <properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>RELEASE</version>
      <scope>compile</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>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

  1. 添加注解,声明是一个eureka客户端
package com.lizhaoblog.scl.pro002eurekatest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class Pro002EurekaTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(Pro002EurekaTestApplication.class, args);
    }

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        // http://127.0.0.1:8762/hi?name=1228
        return "hi " + name + ",i am from port:" + port;
    }
}

  1. 修改application.yml配置文件
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8762
spring:
  application:
    name: service-hi



  1. 启动
  2. 回头看http://localhost:8761/网址,找找不同(可以在网页中搜索Instances currently registered with Eureka)。

总结

广告时间

我是小王,一个喜欢抛转的码人。