欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡

程序员文章站 2022-06-06 14:49:10
...

Kite学习框架的第二十一天

1. EurekaServer集群配置

首先在C:\Windows\System32\drivers\etc下的hosts配置文件中配置映射
Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡

1.1 创建第一个注册中心cloud-eureka-server7001

1.1.1 pom.xml依赖文件的导入

这里注意导入:
spring-cloud-netflix-eureka-server

<?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>demo01cloud</artifactId>
        <groupId>cn.kitey.spring</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7001</artifactId>


    <dependencies>
        <!-- Eureka Server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>



        <!--引入自己创建的entities包-->
        <dependency>
            <groupId>cn.kitey.spring</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId><!-- -->
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

</project>

1.1.2 配置application.yml

这里设置的端口为:7001
这里使用的hostname就是前面配置的映射
注册路径为:http://eureka7002.com:7002/eureka/

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com  #eureka服务端的实例名称
  client:
    #false标识不向注册中心注册自己
    register-with-eureka: false
    #标示自己就是注册中心,我的职责就是维护服务实例,并不需要区检索服务
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/

1.1.3 创建主启动类

注意添加注解
EnableEurekaServer: 表明为Server注册中心

package cn.kitey.springcloud;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args);
    }
}


1.2 创建第二个注册中心cloud-eureka-server7002

1.2.1 pom.xml依赖文件的导入

与cloud-eureka-server7001引入的一样

1.2.2 配置application.yml

  1. 端口改为:7002
  2. hostname改为:eureka7002.com
  3. zhuvedefaultZone: http://eureka7001.com:7001/eureka/
server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com  #eureka服务端的实例名称
  client:
    #false标识不向注册中心注册自己
    register-with-eureka: false
    #标示自己就是注册中心,我的职责就是维护服务实例,并不需要区检索服务
    fetch-registry: false
    service-url:
      zhuvedefaultZone:  http://eureka7001.com:7001/eureka/

1.3.3 创建主启动类

注意添加注解:
@EnableEurekaServer


package cn.kitey.springcloud;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7002.class, args);
    }
}

1.3 可以进行访问一下检测EurekaServer集群配置是否配置完成

  1. 访问:http://eureka7001.com:7001/
    注意已经有了7002 注册中心
    Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
  2. 访问:http://eureka7002.com:7002/
    注意已经有了7001 注册中心
    Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
    表明EurekaServer集群配置创建成功!

2.服务端集群配置

2.1 首相将前面创建的cloud-provider-payment-8001 注册进EurekaServer

前面讲述了cloud-provider-payment-8001的创建了,这里就不多讲述
8001创建过程

2.1.1 配置application.yml文件

注意:
这里注册eureka的地址为集群
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource   #当前数据源的操作类型
    driver-class-name: com.mysql.jdbc.Driver #mysql驱动包
    url: jdbc:mysql:///db2020?characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: 25002500
  jpa:
    show-sql: true

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: cn.kitey.springcloud.entities  #所有的Entity所在的包

eureka:
  client:
    register-with-eureka: true # 是否注册自己的信息到EurekaServer,默认是true
    fetch-registry: true # 是否拉取其它服务的信息,默认是true
    service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
#      defaultZone: http://localhost:7001/eureka
      #下面的为集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka


2.1.2 配置启动类

注意注解:
@EnableEurekaClient 表示将其入住EurekaServer集群


package cn.kitey.springcloud;

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

@SpringBootApplication
@EnableEurekaClient   //表明自己入住Eureka
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

2.1.3 修改一下controller包中的控制类

添加信息:使用的什么端口让其显示,以便于后面的集群访问时进行分辨。
添加属性

Value("${server.port}")    //读取配置文件中的端口信息
    private String serverPort;

将属性输出:


   return new CommonResult(result, "200", "插入数据成功!serverPort: " + serverPort);
   
   return new CommonResult(200,"查询数据成功!serverPort: " + serverPort,paymentById);

全部代码为:


package cn.kitey.springcloud.controller;

import cn.kitey.springcloud.entities.CommonResult;
import cn.kitey.springcloud.entities.Payment;
import cn.kitey.springcloud.service.impl.PaymentServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@Slf4j    //打印日志
public class PaymentController {

    @Resource
    private PaymentServiceImpl paymentService;

    @Value("${server.port}")    //读取配置文件中的端口信息
    private String serverPort;


    /**
     * 数据的插入
     * @param payment
     * @return
     */
    @PostMapping("/payment/create")
    public CommonResult create(@RequestBody Payment payment){
        int result = paymentService.create(payment);
        log.info("******插入结果是" + result);
        if(result > 0){
            return new CommonResult(result, "200", "插入数据成功!serverPort: " + serverPort);
        }else{
            return new CommonResult(444,"插入数据失败!", null);
        }
    }

    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") long id){
        Payment paymentById = paymentService.getPaymentById( id);
        log.info("*****查询数据的结果:" +paymentById);
        if(paymentById !=null){
            return new CommonResult(200,"查询数据成功!serverPort: " + serverPort,paymentById);
        }else{
            return new CommonResult(444,"查询数据失败,你查询的id:" + id,null);
        }
    }

}

2.2 模仿cloud-provider-payment-8001创建cloud-provider-payment-8002提供服务实现集群配置

2.2.1 配置application.yml文件

注意这里端口改为了8002

server:
  port: 8002

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource   #当前数据源的操作类型
    driver-class-name: com.mysql.jdbc.Driver #mysql驱动包
    url: jdbc:mysql:///db2020?characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: 25002500
  jpa:
    show-sql: true

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: cn.kitey.springcloud.entities  #所有的Entity所在的包

eureka:
  client:
    register-with-eureka: true # 是否注册自己的信息到EurekaServer,默认是true
    fetch-registry: true # 是否拉取其它服务的信息,默认是true
    service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
      #      defaultZone: http://localhost:7001/eureka
      #下面的为集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka


2.2.2 修改主启动类

注意注解:
@EnableEurekaClient


package cn.kitey.springcloud;

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

@SpringBootApplication
@EnableEurekaClient   //表明自己入住Eureka
public class PaymentMain8002 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8002.class, args);
    }
}

2.2.3 修改一下controller包中的控制类

修改方法跟cloud-provider-payment-8001 中的修改方法一样

3 将消费者注册进EurekaServer集群

前面讲述了cloud-consumer-order-80消费者的创建了 注意我这里我消费者端口为8
消费者创建过程

3.1 配置application.yml

注意这里的端口设置为:81
注册的为集群: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka


server:
  port: 81

spring:
  application:
    name: cloud-order-service


eureka:
  client:
    # 是否从EurekaServer抓取自己已经有注册信息,集群必须设置为true才能配合ribbon使用
    fetch-registry: true
    #标识是否将自己注册进EurekaServer
    register-with-eureka: true
    service-url:
#      defaultZone: http://localhost:7001/eureka
      #下面的为集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

3.2 修改主启动类

注意添加注解:
@EnableEurekaClient


package cn.kitey.springcloud;

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

@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {

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

3.3 修改cloud-consumer-order-80中的controller包中的的控制类

修改访问的url为微服务名称:这个名称可以在http://eureka7002.com:7002/中进行查看,即EurekaServer集群注册中心
原来为:

private static final String PAYMENT_URL = "http://localhost:8001";

现在修改为

    private static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

3.4 修改cloud-consumer-order-80中的配置包下的配置类

添加注解:
@LoadBalanced: 添加后才可以访问微服务名称,并且实现负载均衡


package cn.kitey.springcloud.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 ApplicationContextConfig {

    @Bean
    @LoadBalanced   //使负载均衡,这样才可以访问"http://CLOUD-PAYMENT-SERVICE" 微服务名称
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}

4 进行测试

启动五个module
注意:
先启动7001, 7002 注册中心
在启动服务:8001, 8002
然后启动80
Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
访问:
http://eureka7002.com:7002/
两个服务,一个消费注册成功!
访问
http://eureka7001.com:7001/ 也是同样的效果Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
然后通过:
http://localhost:81/consumer/payment/get/4
进行数据查询,观察端口是否发生变化
第一次为:8001
Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
第二次为:8002
Kite的学习历程之SpringCloud之EurekaServer集群配置,服务端集群配置并且使其负载均衡
端口会进行变化,说明服务端的集群配置成功