springCloud集群案例搭建

springCloud是目前比较流行的微服务框架,它可以很方便很快捷的进行分布式项目的搭建,现在我们就用idea来创建一个简单的springCloud分布式集群案例

实现打开idea

1、新建一个maven父模块

将src目录删除 

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.demo</groupId>
    <artifactId>cloudDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Dalston.SR2</version>
        <relativePath/>
    </parent>

    <modules>
        <module>eureka-server</module>
        <module>eureka-client</module>
    </modules>

</project>

2、新建eureka-server子模块模块,此模块为注册中心模块,它本身即时一个服务

启动类如下:

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


@EnableEurekaServer //该注解,表示开启Eureka server功能
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }



}

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.example</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.cloud.demo</groupId>
        <artifactId>cloudDemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>1.3.2.RELEASE</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

application.yml:

注意代码中符号  ‘---’ 并不是注释,而是分隔符,标识多个开发环境配置或者说多个服务实例配置,比如开发环境,测试环境,生产环境等。或者就是集群的多个服务实例配置



spring:
  profiles:
    active: master
  application:
    name: spring_cloud_eureka


---
spring:
   profiles: master
server:
  port:  8761

eureka:
  instance:
    hostname: master
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://slave:8762/eureka/
  server:
    enable-self-preservation: false



---
spring:
   profiles: slave
server:
  port: 8762

eureka:
  instance:
    hostname: slave
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://master:8761/eureka/
    server:
        enable-self-preservation: false

注意:本地搭建eureka server集群,所以需要修改本地hosts文件。windows系统电脑在C:\Windows\System32\drivers\etc,

mac操作系统通过终端vim/etc/hosts进行编辑修改,修改内容如下

127.0.0.1      master

127.0.0.1      slave

修改完成后保存hosts文件,不过window系统修改后不会马上起效果,我们需要重启电脑,或者清除本地dns缓存

清除缓存命令 ,打开cmd,输入 ipconfig /flushdns

然后我们启动项目,运行启动类,打开:http://master:8761会看到:

然后我们可以再将application.yml文件最上方的profiles.active 修改成slave,然后再重新启动

这样针对eureka-server注册中心服务我们就做到了集群配置

会发现在标签Instances currently registered with Eureka下面没有任何服务,其实此时没有任务服务属于正常现象,

因为我们还没有在注册中心中注册任何客户端服务实例,而注册中心的服务本身我们已经设置成禁止注册

如下

register-with-eureka: false
fetch-registry: false

所以,我们需要新建一个springboot项目,springCloud是依赖springboot的。

在idea父模块上右击新建project  ,选择Spring Initializr 

比如我们新建模块为eureka-client

主方法如下:

package com.example.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  //注册Eureka客户端
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

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.example</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.cloud.demo</groupId>
        <artifactId>cloudDemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--Eureka客户端插件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

application.yml如下:

server:
  port: 8081

spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://master:8761/eureka/,http://slave:8762/eureka/


然后我们启动主方法,注意:前提是注册中心需要开启。

启动成功后我们打开http://master:8761

可以看到在Instances currently registered with Eureka标签下面出现一条记录,记录就是我们新建的客户端服务

当然我们的客户端服务可能因为用户量非常多,我们需要做成集群,多个服务实例。

其实很简单,只需要将端口修改一下即可,比如我们将端口修改成8082然后继续启动服务

这里需要修改一下运行配置,将Single instance only默认的勾选去掉,如下

      可以看到在Instances currently registered with Eureka标签下服务多了一个端口为8082的实例,这样服务消费之调用服务时,就可以根据一定的算法来均衡调用服务,减轻服务的负担,

      至于怎么均衡调用,我们可以在新建一个服务客户端来,该服务主要做的事情就是接受前端发送请求,经过一些权限认证和负载均衡算法然后确定调用那个服务,调用服务的方式有很多,个人推荐RestTemplate。当然SpringCloud在这方面已经有自己的一些api,比如处理网关方面的Zuul。

      说到这,或许有仁兄问了,这个服务承载了所有的前端请求,压力那么大,万一崩溃了咋办? 集群!集群!集群!

重要的事情说三遍,涉及到这种关键的服务,集群的作用就体现出来了。

      或许有的仁兄会问上面那行红字是什么意思,这里解释一下:

      红字翻译为:自保模式被撤销。这可能无法保护网络/其他问题的情况下失效。

      我们回到最上面搭建eureka-server注册中心时,application.yml配置文件中有这样一段代码:

  server:
    enable-self-preservation: false

该行代码标识服务自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true,这里我们修改为false。则自保模式被撤销,才会有这样的警告

接下啦我们做一下简单的负载均衡服务配置以及负载均衡测试

      首先我们需要先新建一个负责负载均衡的服务项目,这里我们新建eureka-client1,和上面的eureka-client的新建方式一样。

新建项目完毕,我们需要在姓名中添加一些负载均衡方面的配置

       pom.xml文件中新增:

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>

      实现负载均衡我们这里通过RestTemplate和Ribbon结合实现。上面的maven依赖就是关于Ribbon插件,Ribbon插件配合RestTemplate简单的使用方式就是在注入RestTemplate的javaBean时,添加@LoadBalanced注解。如下:

       我们在主方法中注入RestTempate,并添加@LoadBalanced注解让RestTemplate达到负载均衡的功能。然后我们新建一个Controller   test,调用eureka-client服务的test接口。eureka-client服务之前没有添加test接口,现在我们在eureka-client中添加test接口:


    @GetMapping("/test")
    public String get(HttpServletRequest request){
        return "request from "+request.getServerPort();
    }

       eureka-client1      主方法代码需要修改:

package com.example.eurekaclient1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@SpringBootApplication
@EnableEurekaClient
@Configuration
@RestController
public class EurekaClient1Application {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClient1Application.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate  restTemplate(){
        return new RestTemplate();
    }

    @Resource
    RestTemplate template;

    @GetMapping("/test")
    public String get(){
        return template.getForObject("http://eureka-client/test",String.class);
    }
}

      application.yml配置文件:

spring:
   application:
      name: test-client
server:
  port: 8083


eureka:
  client:
    service-url:
      defaultZone: http://master:8761/eureka/,http://slave:8762/eureka/



      然后我们刷新maven,启动eureka-client1项目,打开http://master:8761    

可以看到Instances currently registered with Eureka标签下新增一条eureka-client1服务

然后访问:http://master:8083/test   然后不停刷新可以看到返回的信息端口在不停的切换

       如此我们就简单的达到了一个负载均衡的效果,我们可以将eureka-client1服务当做负载均衡器,或者负载均衡设备。

负载均衡器获取前端发送的请求,根据请求参数,确定到底走后台哪个服务。然后在通过Ribbon的注解@LoadBalanced实现

的负载均衡功能确定到底走这个服务的哪个实例。所谓实例就是集群中的一台服务。

       目前案例中只有一个客户端服务eureka-client(可以理解为业务系统,一个真实的管理系统或者网站),当然我们可以新建

更多的服务,如file-manager ,  book-manager等。

       或许有仁兄会问,负载均衡承担了前端所有的请求,负载均衡服务本身可以负载均衡吗?

       对此我只能……………………

       到此为止一个简单的SpringCloud案例算是搭建完成,各路大神菜鸟多多指点

猜你喜欢

转载自blog.csdn.net/zhanglei082319/article/details/82220273