十四、ribbon负载均衡策略应用案例
一、eureka-server服务中心项目不再创建
二、eureka-common-empdept公共组件项目不再掩饰
三、创建eureka-client-provider-empdept-one提供者项目
3.1 结构如下
pom.xml文件内容如下:
1 <dependencies> 2 <dependency> 3 <groupId>cn.kgc</groupId> 4 <artifactId>eureka-common-empdept</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 </dependency> 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-jdbc</artifactId> 10 </dependency> 11 <dependency> 12 <groupId>org.springframework.boot</groupId> 13 <artifactId>spring-boot-starter-web</artifactId> 14 </dependency> 15 <dependency> 16 <groupId>org.mybatis.spring.boot</groupId> 17 <artifactId>mybatis-spring-boot-starter</artifactId> 18 <version>2.1.0</version> 19 </dependency> 20 <dependency> 21 <groupId>org.springframework.cloud</groupId> 22 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 23 </dependency> 24 25 <dependency> 26 <groupId>mysql</groupId> 27 <artifactId>mysql-connector-java</artifactId> 28 <version>5.1.38</version> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 <scope>test</scope> 34 </dependency> 35 </dependencies>
3.2 DeptMapper.java
1 package cn.kgc.mapper; 2 3 import cn.kgc.vo.Dept; 4 import org.apache.ibatis.annotations.Select; 5 6 import java.util.List; 7 8 /** 9 * Created by Administrator on 2019/8/29. 10 */ 11 public interface DeptMapper { 12 @Select("select * from dept") 13 List<Dept> optionData(); 14 }
3.3EmpMapper.java
1 package cn.kgc.mapper; 2 3 import cn.kgc.vo.Emp; 4 import org.apache.ibatis.annotations.Select; 5 6 import java.util.List; 7 import java.util.Map; 8 9 /** 10 * Created by Administrator on 2019/8/29. 11 */ 12 public interface EmpMapper { 13 List<Map<String,Object>> showData(Emp emp); 14 }
3.4EmpMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="cn.kgc.mapper.EmpMapper"> 6 <select id="showData" resultType="map" parameterType="emp"> 7 select d.dname,d.loc,e.* from emp e,dept d where e.deptno=d.deptno 8 <if test="empno!=null"> 9 and e.empno=#{empno} 10 </if> 11 <if test="deptno!=null and deptno!=-1"> 12 and e.deptno=#{deptno} 13 </if> 14 </select> 15 </mapper>
3.5DeptService.java
1 package cn.kgc.service; 2 3 import cn.kgc.vo.Dept; 4 import org.apache.ibatis.annotations.Select; 5 6 import java.util.List; 7 8 /** 9 * Created by Administrator on 2019/8/29. 10 */ 11 public interface DeptService { 12 List<Dept> optionData(); 13 }
3.6 DeptServiceImpl.java
1 package cn.kgc.service; 2 3 import cn.kgc.mapper.DeptMapper; 4 import cn.kgc.vo.Dept; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Service; 7 8 import java.util.List; 9 10 @Service 11 public class DeptServiceImpl implements DeptService{ 12 13 @Autowired 14 private DeptMapper deptMapper; 15 16 public List<Dept> optionData() { 17 return deptMapper.optionData(); 18 } 19 }
3.7 EmpService.java
1 package cn.kgc.service; 2 3 import cn.kgc.vo.Emp; 4 5 import java.util.List; 6 import java.util.Map; 7 8 /** 9 * Created by Administrator on 2019/8/29. 10 */ 11 public interface EmpService { 12 List<Map<String,Object>> showData(Emp emp); 13 }
3.8 EmpServiceImpl.java
1 package cn.kgc.service; 2 3 import cn.kgc.mapper.EmpMapper; 4 import cn.kgc.vo.Emp; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Service; 7 import org.springframework.transaction.annotation.Transactional; 8 9 import java.util.List; 10 import java.util.Map; 11 12 @Service 13 @Transactional 14 public class EmpServiceImpl implements EmpService{ 15 @Autowired 16 private EmpMapper empMapper; 17 18 public List<Map<String, Object>> showData(Emp emp) { 19 return empMapper.showData(emp); 20 } 21 }
3.9 CenterController,java
1 package cn.kgc.controller; 2 3 import cn.kgc.mapper.DeptMapper; 4 import cn.kgc.mapper.EmpMapper; 5 import cn.kgc.service.DeptService; 6 import cn.kgc.service.EmpService; 7 import cn.kgc.vo.Dept; 8 import cn.kgc.vo.Emp; 9 import org.slf4j.Logger; 10 import org.slf4j.LoggerFactory; 11 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.web.bind.annotation.RequestBody; 13 import org.springframework.web.bind.annotation.RequestMapping; 14 import org.springframework.web.bind.annotation.RequestParam; 15 import org.springframework.web.bind.annotation.RestController; 16 17 import java.util.List; 18 import java.util.Map; 19 20 @RestController 21 public class CenterController { 22 23 @Autowired 24 private EmpService empService; 25 26 @Autowired 27 private DeptService deptService; 28 29 private Logger logger= LoggerFactory.getLogger(CenterController.class); 30 31 @RequestMapping("/ribbon.do") 32 public String ribbonTest(@RequestParam("count") Integer count){ 33 logger.info("provider>>> "+count+" <<<eureka-client-provider-one-8762"); 34 return "provider的ribbon测试"; 35 } 36 37 @RequestMapping("/option.do") 38 public List<Dept> optionData() { 39 return deptService.optionData(); 40 } 41 42 @RequestMapping("/data.do") 43 public List<Map<String, Object>> showData(@RequestBody Emp emp) { 44 return empService.showData(emp); 45 } 46 }
3.10 启动类的设置
1 package cn.kgc; 2 3 import org.mybatis.spring.annotation.MapperScan; 4 import org.springframework.boot.SpringApplication; 5 import org.springframework.boot.autoconfigure.SpringBootApplication; 6 import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 7 8 @MapperScan("cn.kgc.mapper") 9 @EnableEurekaClient 10 @SpringBootApplication 11 public class EurekaClientProviderEmpdeptOneApplication { 12 13 public static void main(String[] args) { 14 SpringApplication.run(EurekaClientProviderEmpdeptOneApplication.class, args); 15 } 16 17 }
3.11 编写属性文件
1 spring.application.name=provider-empdept 2 3 server.port=8762 4 5 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ 6 7 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 8 spring.datasource.url=jdbc:mysql://192.168.117.145:3306/kh66 9 spring.datasource.username=root 10 spring.datasource.password=ok 11 12 mybatis.type-aliases-package=cn.kgc.vo 13 14 mybatis.mapper-locations=classpath:mapper/*.xml
3.12 启动eureka-server、eureka-client-provider-empdept-one 查看结果
四、创建eureka-client-provider-empdept-two提供者项目,所有的代码模块和eureka-client-provider-empdept-one一模一样,只是端口号不一样即可
五、创建eureka-client-consumer-empdept-p-one消费者项目,
5.1 结构如下
5.2 编写 EmpDeptProviderFeign.java
1 package cn.kgc.fegin; 2 3 import cn.kgc.vo.Dept; 4 import cn.kgc.vo.Emp; 5 import org.springframework.cloud.openfeign.FeignClient; 6 import org.springframework.web.bind.annotation.RequestBody; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestParam; 9 10 import java.util.List; 11 import java.util.Map; 12 13 @FeignClient("provider-empdept") 14 public interface EmpDeptProviderFeign { 15 16 @RequestMapping("/ribbon.do") 17 public String ribbonTest(@RequestParam("count") Integer count); 18 19 @RequestMapping("/option.do") 20 public String optionData(); 21 22 @RequestMapping("/data.do") 23 public String showData(@RequestBody Emp emp); 24 }
5.3 CenterController.java
1 package cn.kgc.fegin; 2 3 import cn.kgc.vo.Dept; 4 import cn.kgc.vo.Emp; 5 import org.springframework.cloud.openfeign.FeignClient; 6 import org.springframework.web.bind.annotation.RequestBody; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestParam; 9 10 import java.util.List; 11 import java.util.Map; 12 13 @FeignClient("provider-empdept") 14 public interface EmpDeptProviderFeign { 15 16 @RequestMapping("/ribbon.do") 17 public String ribbonTest(@RequestParam("count") Integer count); 18 19 @RequestMapping("/option.do") 20 public String optionData(); 21 22 @RequestMapping("/data.do") 23 public String showData(@RequestBody Emp emp); 24 }
5.4 application.properties属性文件编写
1 spring.application.name=consumer-empdept-p-one 2 3 server.port=8764 4 5 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
5.5 编写启动类
1 package cn.kgc; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 6 import org.springframework.cloud.netflix.ribbon.RibbonClient; 7 import org.springframework.cloud.openfeign.EnableFeignClients; 8 9 @EnableFeignClients 10 @EnableEurekaClient 11 @SpringBootApplication 12 public class EurekaClientConsumerEmpdeptPOneApplication { 13 14 public static void main(String[] args) { 15 SpringApplication.run(EurekaClientConsumerEmpdeptPOneApplication.class, args); 16 } 17 18 }
5.6 启动项目顺序为:eureka-server、eureka-client-provider-empdept-one、eureka-client-provider-empdept-two、eureka-client-consumer-empdept-p-one
因为没有设置负载均衡策略,因此他会按照默认方式既 轮询策略进行调用,
5.7 再次选择配置ribbon负载均衡策略为随机分配,再看效果,属性文件设置如下
1 spring.application.name=consumer-empdept-p-one 2 3 server.port=8764 4 5 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ 6 7 #随机分配策略 8 provider-empdept.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
5.8 再次按照刚才的启动顺序启动,再来查看
可以挨个把负载均衡策略试一下
原文地址:https://www.cnblogs.com/holly8/p/11430924.html
- Go语言interface的value.(type)使用小技巧-转
- 干货 | Elasticsearch5.X Mapping万能模板
- MySQL 5.7安装部署总结(r10笔记第77天)
- Go语言中Socket通信TCP服务端
- MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)
- MySQL修改数据类型的问题总结(r10笔记第74天)
- 深究|Elasticsearch单字段支持的最大字符数?
- Go语言中Socket通信之Tcp客户端
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TF入门04-TF实现Word2Vec
- TF入门03-实现线性回归&逻辑回归
- TF入门02-TensorFlow Ops
- 前端|利用Verify插件实现前端图像验证码
- 3分钟短文 | PHP位运算和逻辑运算,一个符号写两遍这么简单?
- 打卡群刷题总结0721——搜索二维矩阵
- NumPy进阶80题完整版|附Notebook版本下载
- 【LeetCode每日一题】21. Merge Two Sorted Lists
- 计算广告笔记06-程序化交易广告
- TF入门05-实验过程管理
- [LeetCode]709. To Lower Case
- ISO C forbids comparison between pointer and integer [-fpermissive]
- 【疑难杂症】解决-TensorFlow “FutureWarning: Conversion of the”
- [Deep-Learning-with-Python] 文本序列中的深度学习
- TN-SCUI2020挑战赛详细讲解