服务注册与发现Eureka(Finchley版本)
创建服务注册中心,采用Eureka作为服务注册与发现的组件。
创建maven主工程
首先创建一个主Maven工程,在其pom文件引入依赖,spring Boot版本为2.1.6.RELEASE,Spring Cloud版本为Finchley.RELEASE。这个pom文件作为父pom文件,起到依赖版本控制的作用,其他module工程继承该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>
<groupId>com.sire</groupId> <artifactId>springcloude_test04</artifactId> <version>1.0-SNAPSHOT</version>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> </parent>
<modules> <module>eureka_server</module> <module>eureka_client</module> </modules>
<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>Finchley.RELEASE</spring-cloud.version> </properties>
<dependencies> <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> </project> |
服务注册中心Eureka server
创建一个module,右键工程->创建model-> 选择spring initialir 如下图:
下一步->选择cloud discovery->eureka server ,然后一直下一步就行了。
pom
其pom.xml继承了父pom文件,引入spring-cloud-starter-netflix-eureka-server的依赖。
<?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>com.sire</groupId> <artifactId>springcloude_test04</artifactId> <version>1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.sire</groupId> <artifactId>eureka_server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka_server</name> <description>Demo project for Spring Boot</description>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
</project> |
注解@EnableEurekaServer
注解@EnableEurekaServer需在springboot工程的启动application类上加:
appication.yml
eureka是一个高可用的组件,无后端缓存,每一个实例注册之后需向注册中心发送心跳(可在内存中完成),默认情况erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.yml:
#端口 server: port: 8761 # eureka配置 eureka: instance: hostname: localhost # 通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server. client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring: application: name: eurka_server |
启动
访问http://localhost:8761/
服务提供中心Eureka client
当client向server注册时,会提供一些元数据,如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。如心跳超时,则通常将该实例从注册server中删除。创建过程同server类似。
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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.sire</groupId> <artifactId>springcloude_test04</artifactId> <version>1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.sire</groupId> <artifactId>eureka_client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka_client</name> <description>Demo project for Spring Boot</description>
<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>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
注解@EnableEurekaClient
通过注解@EnableEurekaClient 表明自己是一个eureka client
@SpringBootApplication @EnableEurekaClient @RestController public class EurekaClientApplication {
public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); }
@Value("${server.port}") String port; @RequestMapping("/hello") public String hello(@RequestParam(value = "name", defaultValue = "sire") String name){ return "hi " + name + " ,i am from port:" + port; } } |
application.yml
spring.application.name这个很重要,以后的服务间相互调用一般都是根据这个name。
配置文件中注明服务注册中心的地址,application.yml配置文件如下:
server: port: 8762
spring: application: name: service_client
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ |
启动
运行EurekaClientApplication(需先将EurekaServerApplication
启动),然后打开http://localhost:8761/
访问http://localhost:8762/hello出现内容
注意
当将客户端关闭后,再次打开Eureka的注册页面,发现有一串红字:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
这是因为Eureka进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;
这时再次将服务端启动后再重启客服端,刷新服务注册中心会发现,自我保护状态已取消。