借助Netflix Eureka进行Spring Cloud Service发现

了解如何创建微服务的基础上,Spring Cloud ,对Netflix的尤里卡注册表服务器以及如何等微服务(尤里卡客户端)使用它来注册和发现服务来调用其API。

我们将使用基于Spring Boot的Spring Cloud API。我们将使用Netflix Eureka服务器来构建服务注册服务器,并使用Eureka客户端进行注册并发现其他服务以调用REST API。

总览

我们将为此Netflix Eureka示例创建三个微服务。

  1. Eureka服务注册表服务器 –该微服务将提供服务注册表和发现服务器。
  2. Student微服务 –将基于Student实体提供一些功能。这将是一个基于休息的服务,最重要的是它将是一个eureka客户服务,它将与eureka服务对话以在服务注册表中注册自己。
  3. School微服务–与Student服务的类型相同–唯一增加的功能是它将通过服务查找机制调用Student服务。我们不会使用Student服务的绝对URL与该服务进行交互。

这是上面列出的三个服务之间的交互图。

组件之间的交互

技术堆栈和运行时

  • Java 1.8
  • Eclipse IDE
  • Spring Cloud
  • Spring Boot
  • Spring休息
  • 马文
目录

什么是Netflix Eureka服务器和客户端?
Eureka服务注册表服务器
Eureka客户端-Student服务
Eureka客户端- 
服务发现和调用
事物的
School服务演示,以检查是否遇到任何错误摘要

什么是Netflix Eureka服务器和客户端?

众所周知,如今,微服务的发展势头非常强劲。从单片架构过渡到基于微服务的体系结构在可维护性,可伸缩性,高可用性等方面为将来带来了许多好处。但是,与此同时,在进行这种迁移时也面临许多挑战。其中之一是维护单个微服务地址。这项任务可能非常复杂-取决于服务的数量及其动态性质。如果整个基础架构都是分布式的,并且还存在一些复制,那么维护该服务地址将变得更加困难。

为了解决这个问题,在分布式计算中有一个称为“服务注册和发现”的概念,其中一个专用服务器负责维护所有已部署和删除的微服务的注册表。这就像所有其他应用程序/微服务的电话簿一样。

可以将其视为微服务(客户端)可以注册自己并发现其他已注册微服务的查找服务。当客户端微服务向Eureka注册时,它会提供元数据,例如主机,端口和运行状况指示器,从而允许其他微服务发现它。发现服务器期望来自每个微服务实例的常规心跳消息。如果实例开始始终无法发送心跳,发现服务器将从其注册表中删除该实例。这样,我们将拥有一个非常稳定的微服务生态系统,彼此协作,并且最重要的是,我们不必手动维护其他微服务的地址,如果频繁进行规模扩大/缩减,则这是几乎不可能完成的任务,根据需要,我们使用虚拟主机专门在云环境中托管服务。

Eureka服务注册表服务器

请按照以下步骤创建和运行Eureka服务器。

创建尤里卡服务器

Spring Boot初始化器门户创建一个带有两个依赖项的Spring Boot项目,即Eureka serverActuator。给出其他Maven GAV坐标并下载项目。

Eureka服务器服务项目生成

将项目解压缩并将其作为现有的maven项目导入Eclipse。在此步骤中,将从maven存储库下载所有必需的依赖项。

现在SpringEurekaServerApplication,在下载的项目中已生成spring的开放类,并@EnableEurekaServer在该类上添加注解。

package com.example.howtodoinjava.springeurekaserver;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@EnableEurekaServer
@SpringBootApplication
public class SpringEurekaServerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringEurekaServerApplication.class, args);
    }
}

再次构建项目。使用此注解,此工件将充当微服务注册表和发现服务器。

服务器配置

application.ymlsrc\main\resources目录中创建一个文件。添加这些属性–

server:
  port: ${PORT:8761} # Indicate the default PORT where this service will be started
eureka:
  client:
    registerWithEureka: false   #telling the server not to register himself in the service registry
    fetchRegistry: false
  server:
    waitTimeInMsWhenSyncEmpty: 0    #wait time for subsequent sync

bootstrap.ymlsrc\main\resources目录中创建另一个文件。添加这些属性–

spring:
  application:
    name: eureka
  cloud:
    config:
      uri: ${CONFIG_SERVER_URL:http://localhost:8888}

测试Eureka服务器

作为Spring Boot应用程序启动该应用程序。打开浏览器并转到http://localhost:8761/,您应该看到如下所示的eureka服务器主页。

没有任何客户端的Eureka控制台

请注意,目前尚未在此处注册任何服务,这是我们期望的,一旦我们启动客户端服务,此服务器将自动更新客户端服务的详细信息。

尤里卡客户–Student服务

请按照以下步骤创建并运行运行Student服务的Eureka客户端。

创建尤里卡客户项目

从初始门户网站有四个依赖,即创建一个Spring Boot 的项目ActuatorWebRest RepositoriesEureka Discovery。给出其他Maven GAV坐标并下载项目。

客户项目生成–
Student微服务

将项目解压缩并将其作为现有的maven项目导入Eclipse。

现在@EnableEurekaClient,在src文件夹中存在的Spring Boot应用程序类上添加注解。使用此注解,此工件将充当Spring Discovery客户端,并在连接到此服务的eureka服务器中进行注册。

package com.example.howtodoinjava.springeurekaclientstudentservice;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 
@SpringBootApplication
@EnableEurekaClient
public class SpringEurekaClientStudentServiceApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringEurekaClientStudentServiceApplication.class, args);
    }
}

客户端配置

application.ymlsrc\main\resources目录中创建一个名为的文件,并在下面添加行。

server:
  port: 8098    #default port where the service will be started
eureka:         #tells about the Eureka server details and its refresh time
  instance:
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
    healthcheck:
      enabled: true
    lease:
      duration: 5
spring:    
  application:
    name: student-service   #current service name to be used by the eureka server
    
management:
  security:
    enabled: false  #disable the spring security on the management endpoints like /env, /refresh etc。
logging:
  level:
    com.example.howtodoinjava: DEBUG

添加REST API

现在添加一个RestController并公开一个休息点,以获取特定School的所有Student详细信息。在这里,我们公开/getStudentDetailsForSchool/{schoolname}了服务于业务目的的端点。为简单起见,我们正在对Student详细信息进行硬编码。

package com.example.howtodoinjava.springeurekaclientstudentservice.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.howtodoinjava.springeurekaclientstudentservice.domain.Student;
@RestController
public class StudentServiceController {
    private static Map<String, List<Student>> schooDB = new HashMap<String, List<Student>>();
    static {
        schooDB = new HashMap<String, List<Student>>();
        List<Student> lst = new ArrayList<Student>();
        Student std = new Student("Sajal""Class IV");
        lst.add(std);
        std = new Student("Lokesh""Class V");
        lst.add(std);
        schooDB.put("abcschool", lst);
        lst = new ArrayList<Student>();
        std = new Student("Kajal""Class III");
        lst.add(std);
        std = new Student("Sukesh""Class VI");
        lst.add(std);
        schooDB.put("xyzschool", lst);
    }
    @RequestMapping(value = "/getStudentDetailsForSchool/{schoolname}", method = RequestMethod.GET)
    public List<Student> getStudents(@PathVariable String schoolname) {
        System.out.println("Getting Student details for " + schoolname);
        List<Student> studentList = schooDB.get(schoolname);
        if (studentList == null) {
            studentList = new ArrayList<Student>();
            Student std = new Student("Not Found""N/A");
            studentList.add(std);
        }
        return studentList;
    }
}

Student 类是一个简单的POJO。

public class Student
{
    private String name;
    private String className;
    
    public Student(String name, String className) {
        super();
        this.name = name;
        this.className = className;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
}

测试尤里卡客户

作为spring boot应用程序启动该项目。现在,验证此服务已在Eureka服务器中自动注册。转到Eureka服务控制台并刷新页面。现在,如果一切顺利,我们将在eureka服务控制台中看到一项Student服务条目。这表明Eureka服务器和客户端都相互了解。

已注册Student服务的Eureka控制台

现在,我们将验证/getStudentDetailsForSchool/{schoolname}端点是否已启动并正在运行。转到浏览器并转到http://localhost:8098/getStudentDetailsForSchool/abcschool,它将为特定School提供Student详细信息abcschool

Student服务响应

尤里卡客户–School服务

现在,我们将创建School服务,该服务将在eureka服务器中进行注册-它将发现并调用没有硬编码URL路径的Student服务。

遵循创建Student服务的确切步骤,以及创建并运行运行School服务的Eureka客户程序。

创建尤里卡客户项目

从初始门户网站有四个依赖,即创建一个Spring Boot 的项目ActuatorWebRest RepositoriesEureka Discovery。给出其他Maven GAV坐标并下载项目。

将项目解压缩并将其作为现有的maven项目导入Eclipse。

现在@EnableEurekaClient,在src文件夹中存在的Spring Boot应用程序类上添加注解。使用此注解,此工件将充当Spring Discovery客户端,并在连接到此服务的eureka服务器中进行注册。

package com.example.howtodoinjava.springeurekaclientschoolservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class SpringEurekaClientSchoolServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringEurekaClientSchoolServiceApplication.class, args);
    }
}

客户端配置

application.ymlsrc\main\resources目录中创建一个名为的文件,并在下面添加行。除了端口号和服务名称外,这些配置与Student服务非常相似。

server:
  port: 9098    #port number
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
    healthcheck:
      enabled: true
    lease:
      duration: 5
spring:
  application:
    name: school-service    #service name
logging:
  level:
    com.example.howtodoinjava: DEBUG

添加使用Student服务的REST API的REST API

现在添加一个RestController并公开一个休息点以获取School详细信息。该端点将使用带有应用程序名称的服务发现样式URL,而不是带有host:port的完整URL。

package com.example.howtodoinjava.springeurekaclientschoolservice.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class SchoolServiceController {
    @Autowired
    RestTemplate restTemplate;
    @RequestMapping(value = "/getSchoolDetails/{schoolname}", method = RequestMethod.GET)
    public String getStudents(@PathVariable String schoolname)
    {
        System.out.println("Getting School details for " + schoolname);
        String response = restTemplate.exchange("http://student-service/getStudentDetailsForSchool/{schoolname}"
                                HttpMethod.GET, nullnew ParameterizedTypeReference<String>() {}, schoolname).getBody();
        System.out.println("Response Received as " + response);
        return "School Name -  " + schoolname + " \n Student Details " + response;
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

这样,我们就可以摆脱特定的服务配置,并且可以赋予服务查找此处提供的eureka服务器和其余模板的责任。@LoadBalanced如果多个实例正在为同一服务运行,我们也可以在此处应用负载平衡(请参阅注解)。

我们使用的网址是http://student-service/getStudentDetailsForSchool/{schoolname}。显然,我们只使用服务名称 student-service代替host:port。这将由spring框架,eureka服务器和rest模板在内部处理。

服务发现和呼叫演示

现在也开始School服务。所有这三个服务都已启动。检查eureka服务器控制台。Student和School服务都必须在此注册。

两种服务均已注册的Eureka控制台

转到浏览器并转到http:// localhost:9098 // getSchoolDetails / abcschool,它将提供特定Schoolabcschool详细信息的School详细信息。我们在内部调用了Student服务。响应看起来像在浏览器中:

School服务回应

检查是否遇到任何错误的事情

  1. 注解@EnableEurekaServer@EnableEurekaClient是应用程序生态系统的核心。没有这两个东西将根本无法工作。
  2. 确保在启动配置客户端服务时,eureka服务器服务已在运行,否则可能要花一些时间进行注册,这可能会在测试时造成混乱。

摘要

我们看到了如何轻松高效地部署服务注册表和发现服务器以及客户端。Spring框架在内部维护着很多东西。在这里,我们仅使用几个注解和非常少的配置即可快速完成所有操作。

这就是创建spring may eureka服务器和微服务注册的全部内容。如果您在执行本文时遇到任何困难,请添加评论。我们将很乐意调查这个问题。

21

 发表评论

17
4
0
 20
  订阅  

saigon has written 1445 articles

One thought on “借助Netflix Eureka进行Spring Cloud Service发现

Leave a Reply