第二部分:搭建Eureka Client集群(普通应用服务) ---生产者服务
Step1:新建工程,引入配置文件
Eureka Client的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>com.cloud</groupId> <artifactId>producer-srv</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>producer-srv</name> <description>producer-srv</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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.SR2</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> <!-- 修改后立即生效, 热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </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> <configuration> <!-- 没有该配置,devtools 不生效 --> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> <!-- spring Boot在编译的时候,是有默认JDK版本的,这里自定义指定JDK版本 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.yame.Application</mainClass> <useUniqueVersions>false</useUniqueVersions> </manifest> <manifestEntries> <Class-Path>./</Class-Path> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> <!--远程仓库--> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>Step3:工程配置和测试代码
spring: application: name: producer eureka: client: serviceUrl: defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/,http://peer3:8002/eureka/ instance: #不使用主机名来定义注册中心的地址, 而使用IP地址的形式, #如果设置了ipAddress 属性, 则使用该属性配置的IP, 否则自动获取除环路IP外的第一个IP地址 preferIpAddress: true #自动将IP注册到Eureka Server上, 如果不配置就是机器的主机名 #ipAddress: 192.168.1.128 # IP地址 #将Instance ID设置成IP:端口的形式 instance-id: ${spring.cloud.client.ipAddress}:${server.port} #注意:更改Eureka更新频率将打破服务器的自我保护功能, 生产环境下不建议自定义这些配置。 lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒) lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒)Step2:代码配置
//@EnableDiscoveryClient @EnableEurekaClient @SpringBootApplication public class EurekalclientApplication { public static void main(String[] args) { SpringApplication.run(EurekalclientApplication.class, args); } }提供一个测试的Controller:
package com.cloud.hello; import com.cloud.config.IpConfiguration; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.core.env.Environment; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.ArrayList; import java.util.List; /** * @author Administrator * @date 2018/5/18 17:28:38 */ @Controller public class ProducerController { // Eureka客户端 @Qualifier("eurekaClient") @Autowired private EurekaClient eurekaClient; //服务发现客户端 @Autowired private DiscoveryClient discoveryClient; @Autowired private Environment env; @RequestMapping("/hello") @ResponseBody public String hello() { return "hello--" + env.getProperty("server.port"); } @RequestMapping("/instance") @ResponseBody public List<ServiceInstance> instance() { List<ServiceInstance> srvList = discoveryClient.getInstances("producer1"); return srvList; } @RequestMapping("/registered") @ResponseBody public List<ServiceInstance> getRegistered() { List<ServiceInstance> list = discoveryClient.getInstances("producer"); if (list != null && list.size() > 0) { System.out.println(list.size()); System.out.println(list.get(0).getUri()); } List<String> serviceNameArr = discoveryClient.getServices(); System.out.println("discoveryClient.getServices().size() = " + serviceNameArr.size()); List<ServiceInstance> sList = new ArrayList<>(); for (String s : serviceNameArr) { System.out.println("services " + s); List<ServiceInstance> serviceInstances = discoveryClient.getInstances(s); sList.addAll(serviceInstances); for (ServiceInstance si : serviceInstances) { System.out.println(" services:" + s + ":getHost()=" + si.getHost()); System.out.println(" services:" + s + ":getPort()=" + si.getPort()); System.out.println(" services:" + s + ":getServiceId()=" + si.getServiceId()); System.out.println(" services:" + s + ":getUri()=" + si.getUri()); System.out.println(" services:" + s + ":getMetadata()=" + si.getMetadata()); } } return sList; } @GetMapping("/eureka-instance") public String serviceUrl() { InstanceInfo instance = eurekaClient.getNextServerFromEureka("producer", false); return instance.getHomePageUrl(); } }Step4:启动多个实例
配置不同的启动端口
启动后,我们可以在Eureka的注册中心中可以看到(Peer1和Peer2都可以看到)
到这里,我们的服务注册中心和服务提供者都写好了。