导读
本文学习在Netflix Eureka注册服务器上基于Spring Cloud创建微服务,以及其他微服务(Eureka客户端)如何注册和发现调用其API的服务。
本文示例将使用基于Spring Cloud API的Spring Boot。使用Netflix Eureka服务器来构建服务注册模块和Eureka客户端,客户端自行注册并发现其他服务来调用REST API。
概览
下面将以Netflix Eureka为例创建三个微服务。
1. Eureka服务注册服务器- 此微服务将提供服务注册表和发现服务器。
2. Student微服务- 提供基于Student实体的功能。这是一个基于服务的Rest,最重要的是它是一个Eureka客户端服务,与Eureka服务互动,在服务注册中心注册。
3. School微服务- 与Student服务相同的类型 - 增加的功能是,使用服务查找机制调用Student服务。不会使用Student服务的绝对URL与该服务交互。
以下是上述三种服务之间的交互图。
组件相互作用
技术堆栈和运行时
·Java 1.8
·Eclipse IDE
·Spring Cloud
·Spring Boot
·Spring Rest
·Maven
目录
·什么是 Netflix Eureka 服务器和客户端?
·Eureka服务注册服务器
·Eureka 客户端 - Student Service
·Eureka 客户端 - School Service
·服务发现演示和调用
·错误检查
·总结
1
什么是Netflix Eureka服务器和客户端?
微服务搭建有很多动力。从单体机到基于架构的微服务的转换,在可维护性、可扩展性、高可用性等方面为未来带来了诸多益处。与此同时,迁移过程中也面临着许多挑战。其中之一是维护单个微服务地址。这个任务非常复杂 - 取决于服务的数量和动态性质。如果整个基础架构是分布式的,并且可复制,那么维护会更困难。
为了解决这个问题,在分布式计算中有个叫做“服务注册和发现”的概念,其中一个专用服务器负责维护已经部署和移除所有微服务注册表,就像所有其他应用程序/微服务的电话簿一样。
把它看作是一个查找服务,微服务(客户端)可以注册并发现其他已注册的微服务。当客户端微服务向Eureka注册时,提供诸如主机,端口和健康指示符等元数据,从而允许其他微服务发现它。发现服务器希望收到来自每个微服务实例的定期消息。如果一个实例始终无法发送检测信号,发现服务器将从注册表中删除该实例。通过这种方式,拥有一个非常稳定的微服务合作生态系统。在这之上不需要手动维护其他微服务地址,如果扩缩非常频繁根据需要,使用虚拟主机专门在云环境中托管服务。
2
Eureka服务注册表服务器
按照以下步骤创建并运行Eureka服务器。
创建Eureka服务器
从Spring Boot初始化程序门户创建一个Spring Boot项目,并具有两个依赖项ie.Eureka server和Actuator。给其他Maven GAV coordinates并下载项目。
Eureka服务器服务项目生成
将项目解压并导入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);
}
}
再次构建项目。有了这个注释,这个组件就像微服务注册表和发现服务器一样。
服务器配置
在src\main\resources目录中创建一个名为application.yml的调用文件。添加这些属性 –
server:
port: $ # 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
在src\main\resources目录中创建另一个名为bootstrap.yml的文件。添加这些属性 –
spring:
application:
name: eureka
cloud:
config:
uri:
测试Eureka服务器
以spring Boot应用程序启动应用。打开浏览器并转到http://localhost:8761/,看到如下所示的Eureka服务器主页。
没有任何客户端的Eureka控制台
请注意,这里没有服务注册,预计一旦启动客户服务,该服务器将自动更新客户端服务的细节。
3
Eureka客户端-Student服务
按照以下步骤创建并运行Eureka客户端 Student服务。
创建Eureka客户端项目
从初始门户创建一个Spring Boot项目有四个依赖关系,即Actuator,Web,Rest Repositories,Eureka Discovery。给其他Maven GAV coordinates并下载项目。
客户端项目生成 -Student微服务
将项目解压并导入Eclipse,作为现有的Maven项目。
在@EnableEurekaClient在Springsrc文件夹中添加Spring Boot应用程序类的注释。有了这个注释,这个组件就像一个弹簧发现客户端一样,并且会在连接到这个服务的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);
}
}
客户端配置
在src\main\resources目录中创建一个名为application.yml的文件并添加下面的行。
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并公开一个rest端点,以获取某所school的所有student详细信息。为了服务商业目的,正在公开/getStudentDetailsForSchool/端点。简单起见,正在编写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> schooDB = new HashMap>();
static {
schooDB = new HashMap>();
List lst = new ArrayList();
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();
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/", method = RequestMethod.GET)
public List getStudents(@PathVariable String schoolname) {
System.out.println("Getting Student details for " + schoolname);
List studentList = schooDB.get(schoolname);
if (studentList == null) {
studentList = new ArrayList();
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;
}
}
测试Eureka 客户端
以Spring Boot应用程序启动这个项目。现在确认这个服务已经自动在Eureka服务器上注册了。转到Eureka服务控制台并刷新页面。如果一切顺利,将在Eureka服务控制台中看到一个student-service项目。这表明,Eureka服务器和客户端都知道对方。
Eureka控制台与Student服务注册
现在将验证/getStudentDetailsForSchool/端点已启动,并正在运行。去浏览器去http://localhost:8098/getStudentDetailsForSchool/abcschool,它会给Student的一个特定的School详细信息abcschool。
Student服务回应
4
Eureka客户端-School服务
现在将创建School服务,它将向Eureka服务器注册 - 它将发现和调用student-service,没有硬编码的URL路径。
按照确切的步骤创建student服务,创建和运行Eureka客户端,和运行School服务一样。
Eureka客户端项目
从初始门户创建一个Spring Boot项目有四个依赖关系,即Actuator,Web,Rest Repositories,Eureka Discovery。给其他Maven GAV coordinates并下载项目。
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);
}
}
将项目解压并导入Eclipse,作为现有的Maven项目。
现在@EnableEurekaClient在Springsrc文件夹中添加Spring Boot应用程序类的注释。有了这个注释,这个组件就像一个弹簧发现客户端一样,并且会在连接到服务的Eureka服务器上自己注册。
客户端配置
在src\main\resources目录中创建一个名为application.yml的文件并添加下面的行。这些配置与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
添加一个RestController并显示rest端点获取school的详细信息。此端点将使用应用程序名称使用服务发现样式URL,而不是使用host。
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/", 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/",
HttpMethod.GET, null, new ParameterizedTypeReference() {}, schoolname).getBody();
System.out.println("Response Received as " + response);
return "School Name - " + schoolname + " \n Student Details " + response;
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
这样可以摆脱具体的服务配置,给服务查找责任Eureka服务器,提供rest模板。如果多个实例运行相同的服务,也可以在这里应用负载均衡(请参阅注释)。
使用的网址是http://student-service/getStudentDetailsForSchool/。显然在host:port的地方,只使用服务名称student-service。这将由spring框架,Eureka服务器和rest模板一起内部处理。
5
服务发现和呼叫演示
现在开始school服务。所有三项服务都已启动。检查Eureka服务器控制台。Student服务和School服务都必须在那里注册。
在浏览器输入http://本地主机:9098 // getSchoolDetails / abcschool,会给school的详细信息为某特定School 的abcschool细节。在内部援引student服务。在浏览器中这种响应看起来像:
school服务回应
6
检查是否面临错误
1. @EnableEurekaServer和@EnableEurekaClient两大注释是应用生态系统的核心。
2. 确保在启动配置客户端服务时,Eureka服务器服务已经运行,否则可能需要一些时间才能注册,这可能会在测试时造成混淆。
总结
通过此文看到了如何轻松地部署服务注册表和发现服务器以及客户端。Spring框架在内部维护着很多东西。这里,只是用几个注释和非常小的配置来快速实现。这就是所有关于Spring Cloud Eureka服务器和服务注册的微服务。
https://howtodoinjava.com/spring/spring-cloud/spring-cloud-service-discovery-netflix-eureka/?utm_source=tuicool&utm_medium=referral
领取专属 10元无门槛券
私享最新 技术干货