Eureka基础概念
概述
Eureka 又称 服务注册中心,全部服务都需要进行注册才能使用,也是微服务架构中必不可少的一个组件。
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架,核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka Serve
Eureka Server提供服务注册服务 各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端
Eureka Client
EurekaClient通过注册中心进行访问,是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。
如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
@EnableEurekaServer
在项目启动类上使用@EnableEurekaServer,可以将项目作为SpringCloud中的注册中心。
在SpringCloud中当你需要使用Eureka
Eureka注册中心的时候你在配置Eureka的服务端的时候需要在启动类上添加@EnableEurekaServer注解
@EnableEurekaClient
在项目启动类上添加@EnableEurekaClient,本服务启动后会自动注册进eureka服务中。
没使用注解的时候,他们还是经过一个注册的方法,(注册到服务中心) 他们应该是根据配置文件来的。
java代码实战
实战架构
建立三个springboot工程,其中一个作为Eureka Server注册中心,其他俩个为俩个不同的端口的service端,客户端向8082端口的studentservice发送一个请求(/getInfo)以后,8082端口的studentservice需要往teacherservice发送一个请求(/getTeacher)返回数据。
父工程pom文件
<groupId>org.example</groupId> <artifactId>eurek-test</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>eurek-serve</module> <module>student-service</module> <module>teacher-service</module> </modules> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.1.1</mybatis.version> </properties> <dependencyManagement> <dependencies> <!-- springCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--nacos的管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
eureka-server服务
pom文件
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!--eureka服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
Application 程序
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
yml配置文件
server: port: 8001 # 服务端口 spring: application: name: eurekaserver # eureka的服务名称 eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:8081/eureka
浏览器访问http://127.0.0.1:8001/ 可以看到web端
student-service服务
pom文件
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </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-web</artifactId> </dependency> </dependencies>
Application 程序
@SpringBootApplication @EnableEurekaClient public class StudentApplication { public static void main(String[] args) { SpringApplication.run(StudentApplication.class,args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
使用restTemplate访问restful接口非常的简单粗暴无脑。
(url, requestMap, ResponseBean.class)这三个参数分别代表
REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
yml配置文件
server: port: 8082 spring: application: name: studentservice eureka: client: service-url: defaultZone: http://127.0.0.1:8081/eureka
Teacher类
@Data @AllArgsConstructor @NoArgsConstructor public class Teacher implements Serializable { private String name; private String sex; }
StudentController
@RestController public class StudentController implements Serializable { @Resource RestTemplate restTemplate; @GetMapping("/getInfo") public Teacher getInfo(){ String url="http://teacherservice/getTeacher"; Teacher teacher = restTemplate.getForObject(url, Teacher.class); return teacher; } }
teacher-service服务
pom文件
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </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-web</artifactId> </dependency> </dependencies>
Application 程序
@SpringBootApplication public class TeacherApplication { public static void main(String[] args) { SpringApplication.run(TeacherApplication.class,args); } }
yml配置文件
server: port: 8083 spring: application: name: teacherservice eureka: client: service-url: defaultZone: http://127.0.0.1:8081/eureka
Teacher类
@Data @AllArgsConstructor @NoArgsConstructor public class Teacher implements Serializable { private String name; private String sex; }
StudentController
@RestController public class TeacherController { @GetMapping("/getTeacher") public Teacher getInfo(){ return new Teacher("张三","男"); } }
测试
浏览器访问:http://localhost:8082/getInfo