SpringCloud搭建Eureka集群(二)

版权声明:lpf https://blog.csdn.net/justlpf/article/details/83382838

第二部分:搭建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都可以看到)

到这里,我们的服务注册中心和服务提供者都写好了。

猜你喜欢

转载自blog.csdn.net/justlpf/article/details/83382838