第二部分:搭建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都可以看到)
到这里,我们的服务注册中心和服务提供者都写好了。