- Eureka服务注册与发现
书签:
(1)Eureka服务启动
(2)Eureka客户端注册服务
(3)Eureka客户端发现服务
(4)Eureka服务集群
(5)Eureka服务其他细节
- Eureka服务启动
新建项目eureka-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>
<groupId>cn.ywj</groupId> <artifactId>eureka-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>eureka-provider</name> <description>Demo project for Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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>Finchley.SR1</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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> </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> |
application.yml 配置如下:
#应用名 spring: application: name: eureka-server # 端口号 server: port: 8080 # eureka配置 eureka: instance: hostname: localhost client: fetch-registry: false # 禁止到Eureka器中获取注册信息 register-with-eureka: false # 禁止将自己作为客户端注册信息到Eureka服务器 serviceUrl: defaultZone: http://127.0.0.1:8080/eureka/ # 告诉别人服务的注册和发现地址 |
启动类上加入注解@EnableEurekaServer 即可:
package cn.ywj.eurekaserver;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication {
public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } |
启动项目,访问http://127.0.0.1:8080/ 如下:
OK.
- Eureka客户端注册服务
新建项目:eureka-provider
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>
<groupId>cn.ywj</groupId> <artifactId>eureka-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>eureka-provider</name> <description>Demo project for Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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>Finchley.SR1</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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> </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> |
application.yml 配置:
#应用名 spring: application: name: eureka-provider # 端口号 server: port: 8081 # eureka配置 eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://127.0.0.1:8080/eureka/ # 服务的注册地址 |
启动类加入注解:@EnableEurekaClient
package cn.ywj.eurekaprovider;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication @EnableEurekaClient public class EurekaProviderApplication {
public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } } |
启动eureka-server项目,再启动eureka-provider,访问http://127.0.0.1:8080/ 如下图:
Instances currently registered with Eureka 有刚才eureka-provider项目的注册信息
- Eureka客户端发现服务
新那一个项目:eureka-consumer
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>
<groupId>cn.ywj</groupId> <artifactId>eureka-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>eureka-consumer</name> <description>Demo project for Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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>Finchley.SR1</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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> </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> |
application.yml 配置
#应用名 spring: application: name: eureka-consumer # 端口号 server: port: 8082 # eureka配置 eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://127.0.0.1:8080/eureka/ # 服务的发现地址 |
修改eureka-provider项目,提供一个接口:
package cn.ywj.eurekaprovider;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication @EnableEurekaClient @RestController public class EurekaProviderApplication {
@GetMapping("/t") public Object t(){// 提供一个接口 return "msg from provider"; }
public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } } |
eureka-consumer项目启动类修改:
package cn.ywj.eurekaconsumer;
import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;
@SpringBootApplication @RestController public class EurekaConsumerApplication {
@Bean public RestTemplate getRestTemplate () {// 注入一个RestTemplate return new RestTemplate() ; }
@Autowired private RestTemplate restTemplate;
@Autowired private EurekaClient eurekaClient;
@RequestMapping("/t") public Object t(){
InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("EUREKA-PROVIDER", false);// 通过服务名可以拿到地址 String str = restTemplate.getForObject(instanceInfo.getHomePageUrl()+"/t", String.class); return str; }
public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } } |
分别启动项目:eureka-server、eureka-provider、eureka-consumer 访问:http://localhost:8082/t 即可获取信息:
msg from provider
- Eureka服务集群
只需修改eureka-server的application.yml中的端口号和defaultZone即可,idea可以一个项目多次启动,所以可以不用创建多个server项目,每次修改application.yml后重新启动项目即可
先配置一下hosts文件:
127.0.0.1 eureka0 127.0.0.1 eureka1 127.0.0.1 eureka2 |
eureka-server项目下创建3个yml:
application-yml8080.yml
application-yml8180.yml
application-yml8280.yml
配置中除了port、hostname、defaultZone 相对应的变化,其他的不变
application-yml8080.yml
#应用名 spring: application: name: eureka-server profiles: active: yml8080 # 端口号 server: port: 8080 # eureka配置 eureka: instance: hostname: eureka0 client: fetch-registry: false # 禁止到Eureka器中获取注册信息 register-with-eureka: false # 禁止将自己作为客户端注册信息到Eureka服务器 serviceUrl: defaultZone: http://eureka1:8180/eureka/,http://eureka2:8280/eureka/ |
application-yml8180.yml
#应用名 spring: application: name: eureka-server profiles: active: yml8180 # 端口号 server: port: 8180 # eureka配置 eureka: instance: hostname: eureka1 client: fetch-registry: false # 禁止到Eureka器中获取注册信息 register-with-eureka: false # 禁止将自己作为客户端注册信息到Eureka服务器 serviceUrl: defaultZone: http://eureka0:8080/eureka/,http://eureka2:8280/eureka/ |
application-yml8280.yml
#应用名 spring: application: name: eureka-server profiles: active: yml8280 # 端口号 server: port: 8280 # eureka配置 eureka: instance: hostname: eureka2 client: fetch-registry: false # 禁止到Eureka器中获取注册信息 register-with-eureka: false # 禁止将自己作为客户端注册信息到Eureka服务器 serviceUrl: defaultZone: http://eureka0:8080/eureka/,http://eureka1:8180/eureka/ |
然后在idea里设置program arguments : --spring.profiles.active=yml8280 (三个启动器,分别对应)
然后分别启动这3个启动器即可,访问:http://eureka0:8080/
接着eureka-provider项目yml修改defaultZone为三个地址即可:
defaultZone: http://eureka0:8080/eureka/,http://eureka1:8180/eureka/,http://eureka2:8280/eureka/ |
- Eureka服务其他细节
1、eureka-provider显示Ip:
eureka: instance: prefer-ip-address: true |
- 自我保护功能关闭:
eureka: server: enable-self-preservation: false #关闭 |