目录

  • 此项目中用到的数据库脚本文件
  • 父模块`cloud2020`中仅有一个`pom.xml`文件
    • 项目结构图
      • `pom.xml`文件
  • 1.创建一个微服务项目用来测试
    • 1.1创建`cloud-api-commons`模块
      • `Payment`类
      • `R`类
      • `ResultCode`类
      • `pom.xml`文件
    • 1.2创建`eureka-server7001`模块
      • `EurekaServerMain`启动类
      • `application.yml`文件
      • `pom.xml`文件
    • 1.3创建`eureka-server7002`模块
      • `EurekaMain7002`启动类
      • `application.yml`文件
      • `pom.xml`文件
    • 1.4创建`cloud-provider-payment8001`模块
      • `PaymentController`
      • `PaymentDao`
      • `PaymentService`
      • `PaymentServiceImpl`
      • `PayMentMain8001`启动类
      • `PaymentMapper.xml`文件
      • `application.yml`文件
      • `pom.xml`文件
    • 1.5创建`cloud-provider-payment8002`模块
      • `application.yml`
    • 1.6创建`cloud-consumer-order80`模块
      • `MySelfRule`
      • `ApplicationContextConfig`
      • `OrderController`
      • `OrderMain80`启动类
      • `application.yml`文件
      • `pom.xml`文件
  • 2.按照以下顺序启动各个模块
    • `eureka-server7001`——>`eureka-server7002`——>`cloud-provider-payment8001`——>`cloud-provider-payment8002`——>`cloud-consumer-order80`
  • 3.打开网页测试一下
    • 再次访问该网址
    • 然后继续访问就会重复调用`cloud-provider-payment8001`服务和`cloud-provider-payment8002`服务,这就是`eureka`自带的负载均衡算法(`轮训算法`)
  • 4.轮训算法原理
  • 联系作者

此项目中用到的数据库脚本文件

/*Navicat Premium Data TransferSource Server         : first-mysqlSource Server Type    : MySQLSource Server Version : 80019Source Host           : 39.97.102.42:3306Source Schema         : testTarget Server Type    : MySQLTarget Server Version : 80019File Encoding         : 65001Date: 10/07/2020 15:45:23
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for edu_teacher
-- ----------------------------
DROP TABLE IF EXISTS `edu_teacher`;
CREATE TABLE `edu_teacher`  (`id` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`intro` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`career` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '讲师资历',`level` int(0) NULL DEFAULT NULL,`avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`sort` int(0) NOT NULL COMMENT '排序',`gmt_create` datetime(0) NOT NULL,`gmt_modified` datetime(0) NOT NULL,`is_deleted` tinyint(1) NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of edu_teacher
-- ----------------------------
INSERT INTO `edu_teacher` VALUES ('1234654', '罗文龙', '前阿里巴巴首席架构师', '高级讲师', 2, 'https://w.wallhaven.cc/full/ox/wallhaven-oxv6gl.png', 1, '2020-04-17 08:12:42', '2020-04-17 08:12:45', 0);
INSERT INTO `edu_teacher` VALUES ('afada', '张三', '前百度高级工程师', '高级讲师', 2, 'https://w.wallhaven.cc/full/xl/wallhaven-xl2qgo.jpg', 1, '2020-04-22 08:14:10', '2020-04-25 08:14:14', 0);-- ----------------------------
-- Table structure for gm_game_property_change
-- ----------------------------
DROP TABLE IF EXISTS `gm_game_property_change`;
CREATE TABLE `gm_game_property_change`  (`propertyChangeId` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '流水id',`gamePlayerId` bigint(0) NOT NULL COMMENT '玩家id',`changeDay` bigint(0) NOT NULL COMMENT 'changeDay日期',`changeWay` int(0) NOT NULL COMMENT '增加或者减少(0:增加1:减小)',`changeCount` int(0) NOT NULL COMMENT '消耗数量',`propertyId` bigint(0) NOT NULL COMMENT '道具id',`changeType` int(0) NOT NULL COMMENT '花费类型1.购买建筑2.购买宠物3.购买建筑皮肤4.购买宠物皮肤5.修复建筑6.修复减产比率7.宠物赎回8.治疗宠物',`targetId` bigint(0) NOT NULL COMMENT '花费的目标id',`changeNumber` bigint(0) NOT NULL,`isValid` int(0) NOT NULL DEFAULT 1 COMMENT '是否有效(0:逻辑删除;1:有效)',`createTime` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`updateTime` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '最后修改时间',`remarks` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`propertyChangeId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Table structure for payment
-- ----------------------------
DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment`  (`id` bigint(0) NOT NULL AUTO_INCREMENT,`serial` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of payment
-- ----------------------------
INSERT INTO `payment` VALUES (1, 'adfggagaggasg');
INSERT INTO `payment` VALUES (2, 'adfg');
INSERT INTO `payment` VALUES (3, NULL);
INSERT INTO `payment` VALUES (4, '1sfasf');
INSERT INTO `payment` VALUES (5, '66666');
INSERT INTO `payment` VALUES (6, '66666');
INSERT INTO `payment` VALUES (7, '7777');SET FOREIGN_KEY_CHECKS = 1;

父模块cloud2020中仅有一个pom.xml文件

项目结构图

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.atguigu.springcloud</groupId><artifactId>cloud2020</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>cloud-provider-payment8001</module><module>cloud-consumer-order80</module><module>cloud-api-commons</module><module>eureka-server7001</module><module>eureka-server7002</module><module>cloud-provider-payment8002</module><module>cloud-provider-payment8004</module></modules><!-- 统一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.16</druid.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version></properties><!-- 子模块继承之后,提供作用:锁定版本 + 子module不用写groupId 和 version--><dependencyManagement><dependencies><!--springboot 2.2.2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency><!--spring cloud alibaba 2.1.0.RELEASE--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>com.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.2.2.RELEASE</version><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build></project>

1.创建一个微服务项目用来测试

此次测试用订单服务模拟负载均衡即通过发送请求获取订单信息

1.1创建cloud-api-commons模块

Payment
package com.atguigu.springcloud.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;/*** @author luowenlong*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {private Long id;private String serial;
}
R
package com.atguigu.springcloud.entity;import lombok.Data;
import java.util.HashMap;
import java.util.Map;/*** 统一返回类型*/
@Data
public class R {private Boolean success;private Integer code;private String message;private Map<String, Object> data = new HashMap<>();private R() {};public static R ok() {R r = new R();r.setSuccess(true);r.setCode(ResultCode.SUCCESS);r.setMessage("成功");return r;}public static R error() {R r = new R();r.setSuccess(false);r.setCode(ResultCode.ERROR);r.setMessage("失败");return r;}public R success(Boolean success) {this.setSuccess(success);return this;}public R message(String message) {this.setMessage(message);return this;}public R code(Integer code) {this.setCode(code);return this;}public R data(Map<String, Object> data) {this.setData(data);return this;}public R data(String key, Object value) {this.data.put(key, value);this.setData(data);return this;}}
ResultCode
package com.atguigu.springcloud.entity;/*** @author luowenlong* @description 返回结果状态码*/
public interface ResultCode {/*** 成功*/Integer SUCCESS = 20000;/*** 失败*/Integer ERROR = 20001;}
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-api-commons</artifactId><dependencies><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>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.1.0</version></dependency></dependencies></project>

1.2创建eureka-server7001模块

EurekaServerMain启动类
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain {public static void main(String[] args) {SpringApplication.run(EurekaServerMain.class, args);}
}
application.yml文件
server:port: 7001eureka:instance:hostname: eureka7001.com #eureka服务端的实例名称client:#false表示不向注册中心注册自己register-with-eureka: false#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7002.com:7002/eureka/
#  server:
#    # 关闭自我保护机制,保证不可用服务被及时剔除
#    enable-self-preservation: false
#    eviction-interval-timer-in-ms: 2000
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server7001</artifactId><dependencies><!--eureka-server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</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-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</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></dependencies></project>

1.3创建eureka-server7002模块

EurekaMain7002启动类
package com.atguigu.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);}}
application.yml文件
server:port: 7002eureka:instance:hostname: eureka7002.com #eureka服务端的实例名称client:#false表示不向注册中心注册自己register-with-eureka: false#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka/
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server7002</artifactId><dependencies><!--eureka-server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</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-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</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></dependencies></project>

1.4创建cloud-provider-payment8001模块

PaymentController
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.entity.Payment;
import com.atguigu.springcloud.entity.R;
import com.atguigu.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;@RestController
@Slf4j
public class PaymentController {@Autowiredprivate PaymentService paymentService;@Autowiredprivate DiscoveryClient discoveryClient;@Value("${server.port}")private String serverPort;@PostMapping("/payment/create")public R create(@RequestBody Payment payment) {final int result = paymentService.create(payment);log.info("******插入结果:" + result);if(result > 0) {return R.ok().message("插入成功,serverPort:" + serverPort);} else {return R.error().message("插入失败");}}@GetMapping("/payment/get/{id}")public R get(@PathVariable("id") Long id) {final Payment payment = paymentService.getPaymentById(id);log.info("******插入结果:" + payment + "O(∩_∩)O哈哈~");if(payment != null) {return R.ok().data("item", payment).message("查询成功,serverPort:" + serverPort);} else {return R.error().message("查询失败");}}@GetMapping("/payment/discovery")public Object discovery() {List<String> services = discoveryClient.getServices();for(String element : services) {log.info("******element:" + element);}List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");for (ServiceInstance instance : instances) {log.info(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());}return this.discoveryClient;}}
PaymentDao
package com.atguigu.springcloud.dao;import com.atguigu.springcloud.entity.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;@Mapper
public interface PaymentDao {int create(Payment payment);Payment getPaymentById(@Param("id") Long id);
}
PaymentService
package com.atguigu.springcloud.service;import com.atguigu.springcloud.entity.Payment;
import org.apache.ibatis.annotations.Param;public interface PaymentService {int create(Payment payment);Payment getPaymentById(@Param("id") Long id);
}
PaymentServiceImpl
package com.atguigu.springcloud.service;import com.atguigu.springcloud.dao.PaymentDao;
import com.atguigu.springcloud.entity.Payment;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class PaymentServiceImpl implements PaymentService{@Autowiredprivate PaymentDao paymentDao;@Overridepublic int create(Payment payment) {return paymentDao.create(payment);}@Overridepublic Payment getPaymentById(@Param("id") Long id) {return paymentDao.getPaymentById(id);}}
PayMentMain8001启动类
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PayMentMain8001 {public static void main(String[] args) {SpringApplication.run(PayMentMain8001.class, args);}
}
PaymentMapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.springcloud.dao.PaymentDao"><insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">insert into payment(serial) values (#{serial});</insert><resultMap id="BaseResultMap" type="com.atguigu.springcloud.entity.Payment"><id column="id" property="id" jdbcType="BIGINT"/><id column="serial" property="serial" jdbcType="VARCHAR"/></resultMap><select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">select * from payment where id = #{id};</select></mapper>
application.yml文件
server:port: 8001spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: 123456eureka:client:#表示是否将自己注册进EurekaServer默认为trueregister-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetch-registry: trueservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
#      defaultZone: http://localhost:7001/eureka 单机版defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版instance:instance-id: payment8001prefer-ip-address: true # 访问路径可以显示IP地址mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.atguigu.springcloud.entity  #所有Entity别名类所在包
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-provider-payment8001</artifactId><dependencies><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</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.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</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></dependencies></project>

1.5创建cloud-provider-payment8002模块

该模块中代码除了application.yml文件外,与cloud-provider-payment8001模块代码一样

application.yml
server:port: 8002spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=trueusername: rootpassword: 123456eureka:client:#表示是否将自己注册进EurekaServer默认为trueregister-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetch-registry: trueservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
#      defaultZone: http://localhost:7001/eureka 单机版defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版instance:instance-id: payment8002prefer-ip-address: true # 访问路径可以显示IP地址mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.atguigu.springcloud.entity  #所有Entity别名类所在包

1.6创建cloud-consumer-order80模块

MySelfRule
package com.atguigu.myrule;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MySelfRule {@Beanpublic IRule myRule() {return new RandomRule(); // 定义为随机}}
ApplicationContextConfig
package com.atguigu.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@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}}
OrderController
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.entity.Payment;
import com.atguigu.springcloud.entity.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@Slf4j
public class OrderController {//    public static final String PAYMENT_URL = "http://localhost:8001";public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/create")public R create(Payment payment) {return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, R.class);}@GetMapping("/consumer/payment/get/{id}")public R getPayment(@PathVariable("id") Long id) {return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, R.class);}}
OrderMain80启动类
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
//此处将我们自定义的负载均衡算法注释了所以会使用eureka自带的轮训算法
//@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class, args);}
}
application.yml文件
server:port: 8000spring:application:name: cloud-order-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=trueusername: rootpassword: 123456eureka:client:#表示是否将自己注册进EurekaServer默认为trueregister-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetch-registry: trueservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
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"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-consumer-order80</artifactId><dependencies><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</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.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</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></dependencies></project>

2.按照以下顺序启动各个模块

eureka-server7001——>eureka-server7002——>cloud-provider-payment8001——>cloud-provider-payment8002——>cloud-consumer-order80

3.打开网页测试一下

再次访问该网址

然后继续访问就会重复调用cloud-provider-payment8001服务和cloud-provider-payment8002服务,这就是eureka自带的负载均衡算法(轮训算法

4.轮训算法原理

联系作者

QQ: 2805005861

Ribbon默认负载均衡算法之轮训算法原理解析相关推荐

  1. ribbon 默认负载均衡 是什么_面试官:说说Ribbon是如何实现负载均衡的?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 来源:blog.csdn.net/LO_YUN/article/details/ ...

  2. Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

    文章目录 Pre 工程 首先屏蔽细粒度配置 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig GlobalRibbonConfig 设置负载均衡策略 开发自定义策略 (权重访问 ...

  3. Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)

    文章目录 Pre 需求 工程 Code 继承AbstractLoadBalancerRule实现自定义Rule 随机权重策略 配置 验证 源码 Pre Spring Cloud Alibaba - 0 ...

  4. Ribbon自定义负载均衡算法

    Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...

  5. 浅析负载均衡的6种算法,Ngnix的5种算法

    转载自 浅析负载均衡的6种算法,Ngnix的5种算法. 常见的几种负载均衡算法 1.轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统 ...

  6. 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等

    1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...

  7. SpringCloud Hoxton版微服务- Ribbon实现负载均衡

    Ribbon实现负载均衡 Ribbon概念 一.Ribbon策略 二.配置使用 1.编写服务提供者 2.编写服务消费者 3.测试负载均衡随机策略 Ribbon概念 Spring Cloud Ribbo ...

  8. Spring Cloud:使用Ribbon实现负载均衡详解(下)

    在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...

  9. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

最新文章

  1. 怎么找回失踪的NTLDR文件
  2. 4 VMware安装
  3. php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
  4. 买卖股票的最佳时机II
  5. 博客杂志CMS模板,wpdx3.6破解版源码WordPress主题
  6. 【翻译】如何获取正在运行的StreamInsight实例版本号?
  7. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  8. kubernetes 安装 helm,ingress
  9. LeetCode每日一题: 搜索插入位置(No.35)
  10. 分布式游戏网关--fooking
  11. wordpress壁纸小程序开源版_图片小程序源码
  12. 利用Wireshark分析UDP数据包
  13. 不上班的活法,在家赚钱的副业兼职
  14. 交通信息工程 实验三:交通信号机仿真实验
  15. 解决No backends or directors found in VCL program, at least one is necessary. Runn
  16. 云游戏的2022:破局、新生、元宇宙
  17. Vue 微信微博分享
  18. 【distillation】shrinkTeaNet:Million-scale Lightweight Face Recognition via Shrinking T-S Networks
  19. HTML5期末大作业:旅游网页设计——山东旅游9页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  20. STM32 IO口输入高低电平

热门文章

  1. Flutter 启动页面
  2. Python 迭代器的使用
  3. php根据背景图片深浅加水印
  4. 职场12年模拟沙盘心得及回顾
  5. IEEE 1471的软件系统架构描述
  6. 将1~100的数字放到10*10的表格中
  7. 赛元单片机 keil 插件安装失败解决方法
  8. 大数据怎样入行,年薪60万大数据架构师教你如何入门
  9. Windwos XP 密匙
  10. 2022低压电工考试题模拟考试题库模拟考试平台操作