美文网首页
2020-02-08_Myclustereurekainacti

2020-02-08_Myclustereurekainacti

作者: kikop | 来源:发表于2020-07-19 18:44 被阅读0次

    Myclustereurekainaction集群模式搭建

    1 概述

    本文着重学习Eureka集群模式的部署,SpringCloud基于Greenwich.RELEASE版本。

    E:\MyWorkspace3\greenwhichcloudaction\myclustereurekainaction。

    1.1工程结构

    image.png

    图 1

    1.2主maven依赖

    
    <?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.kikop.myeurekainaction</groupId>
    
        <artifactId>mysingleeurekainaction</artifactId>
    
        <version>1.0-SNAPSHOT</version>
    
        <modules>
    
            <module>eureka-server</module>
    
            <module>eureka-client</module>
    
        </modules>
    
        <packaging>pom</packaging>
    
        <parent>
    
            <groupId>org.springframework.boot</groupId>
    
            <artifactId>spring-boot-starter-parent</artifactId>
    
            <version>2.1.4.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>Greenwich.RELEASE</spring-cloud.version>
    
        </properties>
    
        <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>
    
    </project>
    
    

    2 eureka Server高可用集群模式

    2.1 clustereurekaserver注册中心

    作为eureka的注册中心。需引用spring-cloud-starter-netflix-eureka-server。

    端口分别为:8761、8762

    2.1.1 maven依赖

    
    <?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">
    
        <parent>
    
            <artifactId>myclustereurekainaction</artifactId>
    
            <groupId>com.kikop.myclustereurekainaction</groupId>
    
            <version>1.0-SNAPSHOT</version>
    
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>eureka-server-cluster</artifactId>
    
        <dependencies>
    
            <!--1.eureka server服务注册中心-->
    
            <dependency>
    
                <groupId>org.springframework.cloud</groupId>
    
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    
            </dependency>
    
            <!--4.test-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-test</artifactId>
    
                <scope>test</scope>
    
            </dependency>
    
            <!--5.actuator-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-actuator</artifactId>
    
            </dependency>
    
        </dependencies>
    
        <build>
    
            <plugins>
    
                <plugin>
    
                    <groupId>org.springframework.boot</groupId>
    
                    <artifactId>spring-boot-maven-plugin</artifactId>
    
                </plugin>
    
            </plugins>
    
        </build>
    
    </project>
    
    

    2.1.2 resources(application.yml)配置

    2.1.2.1 引导配置

    
    spring:
    
       profiles:
    
        active: peer1
    
    

    2.1.2.2 节点1(application-peer1.yml)

    
    #定义了两个profile 文件,分别为peerl 和peer2 ,它们的hostname 分别为peerl
    
    #和peer2 。在实际开发中,可能是具体的服务器F 地址,它们的端口分别为8761 和8762
    
    #因为是在本地搭建Eureka Server 集群,所以需要修改本地的host文件,windows系统的电脑
    
    #在C:\Windows\System32\drivers\etc\hosts 中修改
    
    # 127.0.0.1 peer1
    
    # 127.0.0.1 peer2
    
    ---
    
    spring:
    
       profiles: peer1
    
       application:
    
         name: eurekaservercluster
    
    server:
    
       port: 8761
    
    eureka:
    
      instance:
    
        hostname: peer1
    
      client:
    
        service-url:
    
          defaultZone: http://peer2:8762/eureka/ # 注意: peer1要连接peer2的eureka地址
    
      server:
    
          peer-node-read-timeout-ms: 2000
    
    

    2.1.2.3 节点2

    
    #定义了两个profile 文件,分别为peerl 和peer2 ,它们的hostname 分别为peerl
    
    #和peer2 。在实际开发中,可能是具体的服务器F 地址,它们的端口分别为8761 和8762
    
    #因为是在本地搭建Eureka Server 集群,所以需要修改本地的host文件,windows系统的电脑
    
    #在C:\Windows\System32\drivers\etc\hosts 中修改
    
    # 127.0.0.1 peer1
    
    # 127.0.0.1 peer2
    
    spring:
    
       profiles: peer2
    
       application:
    
        name: eurekaservercluster
    
    server:
    
       port: 8762
    
    eureka:
    
      instance:
    
        hostname: peer2
    
      client:
    
        service-url:
    
          defaultZone: http://peer1:8761/eureka/ # 注意: peer2要连接peer1的eureka地址
    
      server:
    
        peer-node-read-timeout-ms: 2000
    
    

    2.1.2.4 hosts配置

    
    127.0.0.1 peer1
    
    127.0.0.1 peer2
    
    

    2.1.3 JavaMain入口

    
    package com.kikop.eurekaservercluster;
    
    import org.springframework.boot.SpringApplication;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    // 开启 eureka 服务注册
    
    @EnableEurekaServer
    
    //开启组件扫描、bean nest 配置、自动配置
    
    @SpringBootApplication
    
    public class EurekaServerApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(EurekaServerApplication.class, args);
    
        }
    
    }
    
    

    2.1.4测试

    查看服务中心

    http://localhost:8761/

    [图片上传失败...(image-bb65c9-1595155328126)]

    图 2 单个8761节点启动

    [图片上传失败...(image-300aec-1595155328126)]

    图 3 8761节点情况

    [图片上传失败...(image-66c4f9-1595155328126)]

    图 4 8762节点情况

    2.2 eurekaprovider服务提供者

    作为eureka的client_P端,需引用:

    spring-cloud-starter-netflix-eureka-client。

    2.2.1 maven依赖

    
    <?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">
    
        <parent>
    
            <artifactId>myclustereurekainaction</artifactId>
    
            <groupId>com.kikop.myclustereurekainaction</groupId>
    
            <version>1.0-SNAPSHOT</version>
    
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>eureka-provider-cluster</artifactId>
    
        <dependencies>
    
            <!--1.eureak服务提供者-->
    
            <dependency>
    
                <groupId>org.springframework.cloud</groupId>
    
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    
            </dependency>
    
            <!--3.web服务-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-web</artifactId>
    
            </dependency>
    
            <!--4.test-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-test</artifactId>
    
                <scope>test</scope>
    
            </dependency>
    
            <!--5.actuator-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-actuator</artifactId>
    
            </dependency>
    
        </dependencies>
    
        <build>
    
            <plugins>
    
                <plugin>
    
                    <groupId>org.springframework.boot</groupId>
    
                    <artifactId>spring-boot-maven-plugin</artifactId>
    
                </plugin>
    
            </plugins>
    
        </build>
    
    </project>
    
    

    2.1.2.1 引导配置

    
    spring:
    
      profiles:
    
    #  指向 application-node1.xml
    
          active: node1
    
    eureka:
    
      client:
    
    #    高可用的服务注册中心 eureka-server-cluster,端口号分布为:8761,8762
    
        service-url:
    
          defaultZone: http://peer1:8761/eureka/
    
    

    2.1.2.2 节点1(application-peer1.yml)

    
    spring:
    
      application:
    
    #  服务提供者名称一样
    
        name: eureka-provider
    
    server:
    
      port: 8861
    
    

    2.1.2.3 节点2

    
    spring:
    
      application:
    
    #  服务提供者名称一样
    
        name: eureka-provider
    
    server:
    
      port: 8862
    
    

    2.2.3 Java

    2.2.3.1 main入口

    
    package com.kikop.eurekaprovidercluster;
    
    import org.springframework.boot.SpringApplication;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    // 开启 EnableEurekaClient 注解,注册到EurekaServer服务端
    
    @EnableEurekaClient
    
    // springboot应用程序
    
    @SpringBootApplication
    
    public class EurekaProviderApplication {
    
    public static void main(String[] args) {
    
    SpringApplication.run(EurekaProviderApplication.class, args);
    
    }
    
    }
    
    

    2.2.3.2 controller

    
    package com.kikop.eurekaprovidercluster.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    
    import org.springframework.web.bind.annotation.GetMapping;
    
    import org.springframework.web.bind.annotation.RequestParam;
    
    import org.springframework.web.bind.annotation.RestController;
    
    /**
    
     * @author kikop
    
     * @version 1.0
    
     * @project Name: myeurekainaction
    
     * @file Name: ProviderController
    
     * @desc 功能描述
    
     * @date 2020/2/9
    
     * @time 11:02
    
     * @by IDE: IntelliJ IDEA
    
     */
    
    @RestController
    
    public class ProviderController {
    
        @Value("${server.port}")
    
        String port;
    
        @GetMapping("/sayHi")
    
        public String sayHi(@RequestParam String name) {
    
            return "sayHi, "+name+",i am from port:" +port;
    
        }
    
    }
    
    

    2.2.4测试

    基本接口测试:

    http://localhost:8861/provider/sayHi?name=kikop,即使脱离eurekaserver,仍能正常启动。

    如果是服务消费者,需要走eurekaserver,将无法启动。

    [图片上传失败...(image-5f174d-1595155328124)]

    [图片上传失败...(image-ede577-1595155328124)]

    [图片上传失败...(image-5eee82-1595155328124)]

    [图片上传失败...(image-29263c-1595155328124)]

    2.3 eurekaconsumer_restTemplate(by ribbon拦截)服务消费者

    作为eureka的client_P端,需引用:

    spring-cloud-starter-netflix-eureka-client。

    2.3.1 maven依赖

    
    <?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">
    
        <parent>
    
            <artifactId>myclustereurekainaction</artifactId>
    
            <groupId>com.kikop.myclustereurekainaction</groupId>
    
            <version>1.0-SNAPSHOT</version>
    
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>eureka-consumer-restTemplateLB</artifactId>
    
        <dependencies>
    
            <!--1.eureak服务提供者-->
    
            <dependency>
    
                <groupId>org.springframework.cloud</groupId>
    
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    
            </dependency>
    
            <!--2.netflix-ribbon-->
    
            <dependency>
    
                <groupId>org.springframework.cloud</groupId>
    
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    
            </dependency>
    
            <!--3.web服务-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-web</artifactId>
    
            </dependency>
    
            <!--4.test-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-test</artifactId>
    
                <scope>test</scope>
    
            </dependency>
    
            <!--5.actuator-->
    
            <dependency>
    
                <groupId>org.springframework.boot</groupId>
    
                <artifactId>spring-boot-starter-actuator</artifactId>
    
            </dependency>
    
        </dependencies>
    
        <build>
    
            <plugins>
    
                <plugin>
    
                    <groupId>org.springframework.boot</groupId>
    
                    <artifactId>spring-boot-maven-plugin</artifactId>
    
                </plugin>
    
            </plugins>
    
        </build>
    
    </project>
    
    

    2.3.2 resources(application.yml)配置

    
    spring:
    
      application:
    
        name: eureka-consumer-restTemplateLB
    
    server:
    
      port: 8961
    
    eureka:
    
      client:
    
        serviceUrl:
    
          defaultZone: http://peer1:8761/eureka/
    
    

    2.3.3 Java

    2.3.3.1 main

    
    package com.kikop.eurekaconsumer;
    
    import org.springframework.boot.SpringApplication;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
    
     * @author kikop
    
     * @version 1.0
    
     * @project Name: myribbon
    
     * @file Name: EurekaConsumerRestTemplateLBApplication
    
     * @desc 功能描述 负载均衡(restTemplate&ribbon)
    
     * @date 2020/2/8
    
     * @time 13:51
    
     * @by IDE: IntelliJ IDEA
    
     */
    
    // 作为eureka-client
    
    @EnableEurekaClient
    
    @SpringBootApplication
    
    public class EurekaConsumerRestTemplateLBApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(EurekaConsumerRestTemplateLBApplication.class,args);
    
        }
    
    }
    
    

    2.3.3.2 config

    
    package com.kikop.eurekaconsumer.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    
    import org.springframework.context.annotation.Bean;
    
    import org.springframework.context.annotation.Configuration;
    
    import org.springframework.web.client.RestTemplate;
    
    /**
    
     * @author kikop
    
     * @version 1.0
    
     * @project Name: myeurekainaction
    
     * @file Name: MyRestTemplateInterceptorConfig
    
     * @desc 功能描述
    
     * @date 2020/2/9
    
     * @time 11:02
    
     * @by IDE: IntelliJ IDEA
    
     */
    
    @Configuration
    
    public class MyRestTemplateInterceptorConfig {
    
        /**
    
         * 在此类中为IoC 容器中注入一个RestTemplate 的Bean ,
    
         * 并在这个Bean 上加上 @LoadBalanced 注解,此时RestTemplate 就具备了负载均衡能力(@LoadBalanced)。
    
         * @return
    
         */
    
        @Bean
    
        @LoadBalanced
    
        RestTemplate restTemplate() {
    
            return new RestTemplate();
    
        }
    
    }
    
    

    2.3.3.3 service

    
    package com.kikop.eurekaconsumer.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import org.springframework.stereotype.Service;
    
    import org.springframework.web.client.RestTemplate;
    
    /**
    
     * @author kikop
    
     * @version 1.0
    
     * @project Name: myribboninaction
    
     * @file Name: RibbonController
    
     * @desc 功能描述
    
     * @date 2020/2/8
    
     * @time 20:48
    
     * @by IDE: IntelliJ IDEA
    
     */
    
    @Service
    
    public class MyLBUserService {
    
        @Autowired
    
        RestTemplate restTemplate;
    
        /**
    
         * 在该类的hi()方法用restTemplate调用eureka-client的API接口
    
         * Uri 上不需要使用硬编码(比如IP),只需要写服务名eureka-client即可
    
         * 程序会根据服务名称 eureka-client 到Eureka-server 注册中心去自动获取IP和端口信息。
    
         *
    
         * @param name
    
         * @return
    
         */
    
        public String sayHi(String name) {
    
            return restTemplate.getForObject("http://eureka-provider/provider/sayHi?name=" + name, String.class);
    
        }
    
    }
    
    

    2.3.3.4 controller

    
    package com.kikop.eurekaconsumer.controller;
    
    import com.kikop.eurekaconsumer.service.MyLBUserService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import org.springframework.web.bind.annotation.GetMapping;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import org.springframework.web.bind.annotation.RequestParam;
    
    import org.springframework.web.bind.annotation.RestController;
    
    /**
    
     * @author kikop
    
     * @version 1.0
    
     * @project Name: myribboninaction
    
     * @file Name: RibbonController
    
     * @desc 功能描述
    
     * @date 2020/2/8
    
     * @time 20:48
    
     * @by IDE: IntelliJ IDEA
    
     */
    
    @RestController
    
    @RequestMapping("/consumer")
    
    public class MyLBUserController {
    
        @Autowired
    
        MyLBUserService myLBUserService;
    
        @GetMapping("/sayHi")
    
        public String sayHi(@RequestParam(required = false, defaultValue = "海阔天空") String name) {
    
            return myLBUserService.sayHi(name);
    
        }
    
    }
    
    

    2.4测试

    [图片上传失败...(image-1ea5ce-1595155328121)]

    [图片上传失败...(image-670ca7-1595155328121)]

    [图片上传失败...(image-4920b9-1595155328121)]

    参考

    1. Springcloud

    <u>https://spring.io/projects/spring-cloud</u>

    <u>https://start.spring.io/</u>

    相关文章

      网友评论

          本文标题:2020-02-08_Myclustereurekainacti

          本文链接:https://www.haomeiwen.com/subject/jwsrkktx.html