zoukankan      html  css  js  c++  java
  • SpringCloud学习一-搭建netflix-eureka微服务集群

    1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等

    https://spring.io/projects/spring-cloud 

    https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/

    2.新建项目

    打开网址:https://start.spring.io/

    选择需要引入的组件,然后下载下来即可

    3.更改项目结构

    为了测试的方便,需将项目结构更改为多模块的项目。

    步骤如下:

    (1) 依次新建子模块register-center/provider/consumer,删除父模块中多余的src、target等文件夹

    (2) 修改父模块的pom文件:仅保留<dependencyManagement>配置节,<dependencies>配置节全部注释掉,因为可在子模块按需添加依赖。

     (3) 修改register-center的pom中的依赖配置

     <dependencies>
            <!-- Eureka注册中心 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>

    (4) 修改provider和consumer的pom中依赖配置

     <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>
        </dependencies>

    4.新建相应的测试类和配置文件

    4.1 register-center模块

    启动类

    package com.hdwang.springcloudtest.registercenter;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class Application {
    
        /**
         * 运行点对点模式(集群模式)时,通过添加VM参数启动不同的注册中心节点实例
         * 例如:-Dspring.profiles.active=peer2
         *
         * @param args
         */
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    yml配置

    spring:
      application:
        #应用名
        name: register-center
      freemarker:
        template-loader-path: classpath:/templates/
        prefer-file-system-access: false
      #激活的配置,可运行时添加参数进行修改 -Dspring.profiles.active=peer2
      profiles:
        active: peer1
    
    # #Eureka独立模式配置,仅有一个注册中心节点
    #server:
    #  port: 8090
    #eureka:
    #  instance:
    #    hostname: localhost
    #  client:
    #    #仅仅作为注册中心,既不提供服务也不订阅服务
    #    registerWithEureka: false
    #    fetchRegistry: false
    #    #注册中心地址
    #    serviceUrl:
    #      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    
    # Eureka点对点模式,保证注册中心高可用,注册的实例信息会在点与点之间相互同步
    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/
    
    ---
    #每个注册中心节点不同的配置
    spring:
      profiles: peer1
    server:
      port: 8091
    eureka:
      instance:
        #在本机hosts中配置即可
        hostname: peer1.com
    
    ---
    spring:
      profiles: peer2
    server:
      port: 8092
    eureka:
      instance:
        hostname: peer2.com
    
    ---
    spring:
      profiles: peer3
    server:
      port: 8093
    eureka:
      instance:
        hostname: peer3.com

    4.2 provider模块

    启动类

    package com.hdwang.springcloudtest.provider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        /**
         * 运行时添加VM参数: -Dserver.port=8082可以启动多个provider实例
         *
         * @param args
         */
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    服务注册类

    package com.hdwang.springcloudtest.provider.restservice;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 注册的服务
     */
    @RestController
    public class RestService {
        /**
         * 日志
         */
        private static final Logger LOG = LoggerFactory.getLogger(RestService.class);
    
        @RequestMapping("/sayHello")
        public String sayHello(String name) {
            LOG.info("sayHello was called");
            return "hello, " + name;
        }
    }

    yml配置

    spring:
      application:
        #应用名,也是eureka的服务名
        name: provider
      freemarker:
        template-loader-path: classpath:/templates/
        prefer-file-system-access: false
    
    server:
      #运行时,添加参数-Dserver.port=8082运行新的provider实例
      port: 8081
    
    eureka:
      client:
        #注册中心地址
        serviceUrl:
          #注册中心独立模式
          #defaultZone: http://localhost:8090/eureka/
          #注册中心点对点模式
          defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/

    4.3 consumer配置

    启动类

    package com.hdwang.springcloudtest.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    服务调用测试类

    package com.hdwang.springcloudtest.consumer.controller;
    
    import com.netflix.appinfo.InstanceInfo;
    import com.netflix.discovery.EurekaClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.*;
    
    /**
     * 测试
     */
    @RestController
    public class TestController {
    
        /**
         * 使用服务名才能负载均衡,不能使用直接使用地址
         */
        private static final String REST_URL_PREFIX = "http://provider";
    
        @Autowired
        private EurekaClient discoveryClient;
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/testGet")
        public String testGet() {
            ResponseEntity<String> res = restTemplate.getForEntity(REST_URL_PREFIX + "/sayHello?name={1}", String.class, getName());
            return res.getBody();
        }
    
        @GetMapping("/testPost")
        public String testPost() {
            MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();
            params.add("name", getName());
    
    //        HttpHeaders headers = new HttpHeaders();
    //        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    
            HttpEntity< MultiValueMap<String, Object>> request = new HttpEntity<>(params, null);
            ResponseEntity<String> res = restTemplate.postForEntity(REST_URL_PREFIX + "/sayHello", request, String.class);
            return res.getBody();
        }
    
        private String getName() {
            List<String> greetings = Arrays.asList("Bob", "Alice", "Jack");
            Random rand = new Random();
            int randomNum = rand.nextInt(greetings.size());
            return greetings.get(randomNum);
        }
    }

    RestTemplate负载均衡配置类

    package com.hdwang.springcloudtest.consumer.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;
    
    @Configuration
    public class RestTemplateConfig {
    
        /**
         * 构建有负载均衡功能的RestTemplate实例对象
         *
         * @return RestTemplate实例对象
         */
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

    yml配置

    spring:
      application:
        #应用名,也是Eureka的服务名
        name: cosumer
    
    server:
      port: 8088
    
    eureka:
      client:
        #注册中心地址
        serviceUrl:
          #注册中心独立模式
          #defaultZone: http://localhost:8090/eureka/
          #注册中心点对点模式
          defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/

    5.运行测试

    5.1本机hosts配置

    127.0.0.1 peer1.com
    127.0.0.1 peer2.com
    127.0.0.1 peer3.com

    5.2 编辑运行配置

    三个注册中心节点运行配置

     

     

     两个服务提供者的运行配置

     

     5.3 运行程序

    (1) 启动注册中心

    依次启动RegisterCenter1->RegisterCenter2->RegisterCenter3,启动成功后,可访问http://localhost:8091/ 或 http://localhost:8092/ 或 http://localhost:8093/ 查看是否启动成功

     (2)启动服务提供者provider

     依次启动Provider1->Provider2, 随便访问一个注册中心地址首页即可查看状态,如下图

     (3) 启动消费者cosumer

     (4) 在浏览器中进行测试

     测试地址:http://localhost:8088/testPost  /   http://localhost:8088/testGet

     (5) 在Provider1/Provider2的控制台中可以看到输出结果

    2021-04-07 15:26:56.043  INFO 8796 --- [nio-8081-exec-1] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:58.860  INFO 8796 --- [nio-8081-exec-2] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:59.535  INFO 8796 --- [nio-8081-exec-3] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:59.925  INFO 8796 --- [nio-8081-exec-4] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.266  INFO 8796 --- [nio-8081-exec-5] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.663  INFO 8796 --- [nio-8081-exec-6] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.938  INFO 8796 --- [nio-8081-exec-7] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:58.602  INFO 17828 --- [nio-8082-exec-1] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:59.194  INFO 17828 --- [nio-8082-exec-2] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:26:59.737  INFO 17828 --- [nio-8082-exec-3] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.109  INFO 17828 --- [nio-8082-exec-4] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.414  INFO 17828 --- [nio-8082-exec-5] c.h.s.provider.restservice.RestService   : sayHello was called
    2021-04-07 15:27:00.815  INFO 17828 --- [nio-8082-exec-6] c.h.s.provider.restservice.RestService   : sayHello was called

    恭喜!至此,Spring Clound 微服务集群框架您已经搭建成功!

    附录

    github地址:https://github.com/hdwang123/springcloudtest

    参考文章:

    https://www.zhihu.com/question/283286745/answer/763040709

    https://www.cnblogs.com/qdhxhz/p/9357502.html

    https://www.cnblogs.com/cjsblog/p/8005766.html

    https://blog.csdn.net/weixin_44448094/article/details/88535475

  • 相关阅读:
    重装系统之后应装软件
    中文乱码解决方案
    买电脑需要考虑的电脑配置
    JavaBean个人总结
    Servlet个人总结
    web.xml详解
    默认软件
    Eclipse导入项目
    Eclipse插件安装
    Tomcat详解
  • 原文地址:https://www.cnblogs.com/hdwang/p/14628372.html
Copyright © 2011-2022 走看看