springcloud(十四)、ribbon负载均衡策略应用案例

时间:2023-03-09 03:19:28
springcloud(十四)、ribbon负载均衡策略应用案例

一、eureka-server服务中心项目不再创建

二、eureka-common-empdept公共组件项目不再掩饰

三、创建eureka-client-provider-empdept-one提供者项目

3.1 结构如下

springcloud(十四)、ribbon负载均衡策略应用案例

pom.xml文件内容如下:

 <dependencies>
<dependency>
<groupId>cn.kgc</groupId>
<artifactId>eureka-common-empdept</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

pom.xml

3.2 DeptMapper.java

 package cn.kgc.mapper;

 import cn.kgc.vo.Dept;
import org.apache.ibatis.annotations.Select; import java.util.List; /**
* Created by Administrator on 2019/8/29.
*/
public interface DeptMapper {
@Select("select * from dept")
List<Dept> optionData();
}

DeptMapper.java

3.3EmpMapper.java

 package cn.kgc.mapper;

 import cn.kgc.vo.Emp;
import org.apache.ibatis.annotations.Select; import java.util.List;
import java.util.Map; /**
* Created by Administrator on 2019/8/29.
*/
public interface EmpMapper {
List<Map<String,Object>> showData(Emp emp);
}

EmpMapper.java

3.4EmpMapper.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="cn.kgc.mapper.EmpMapper">
<select id="showData" resultType="map" parameterType="emp">
select d.dname,d.loc,e.* from emp e,dept d where e.deptno=d.deptno
<if test="empno!=null">
and e.empno=#{empno}
</if>
<if test="deptno!=null and deptno!=-1">
and e.deptno=#{deptno}
</if>
</select>
</mapper>

EmpMapper.xml

3.5DeptService.java

 package cn.kgc.service;

 import cn.kgc.vo.Dept;
import org.apache.ibatis.annotations.Select; import java.util.List; /**
* Created by Administrator on 2019/8/29.
*/
public interface DeptService {
List<Dept> optionData();
}

DeptService.java

3.6  DeptServiceImpl.java

 package cn.kgc.service;

 import cn.kgc.mapper.DeptMapper;
import cn.kgc.vo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service
public class DeptServiceImpl implements DeptService{ @Autowired
private DeptMapper deptMapper; public List<Dept> optionData() {
return deptMapper.optionData();
}
}

DeptServiceImpl.java

3.7 EmpService.java

 package cn.kgc.service;

 import cn.kgc.vo.Emp;

 import java.util.List;
import java.util.Map; /**
* Created by Administrator on 2019/8/29.
*/
public interface EmpService {
List<Map<String,Object>> showData(Emp emp);
}

EmpService.java

3.8  EmpServiceImpl.java

 package cn.kgc.service;

 import cn.kgc.mapper.EmpMapper;
import cn.kgc.vo.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import java.util.List;
import java.util.Map; @Service
@Transactional
public class EmpServiceImpl implements EmpService{
@Autowired
private EmpMapper empMapper; public List<Map<String, Object>> showData(Emp emp) {
return empMapper.showData(emp);
}
}

EmpServiceImpl.java

3.9 CenterController,java

 package cn.kgc.controller;

 import cn.kgc.mapper.DeptMapper;
import cn.kgc.mapper.EmpMapper;
import cn.kgc.service.DeptService;
import cn.kgc.service.EmpService;
import cn.kgc.vo.Dept;
import cn.kgc.vo.Emp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import java.util.List;
import java.util.Map; @RestController
public class CenterController { @Autowired
private EmpService empService; @Autowired
private DeptService deptService; private Logger logger= LoggerFactory.getLogger(CenterController.class); @RequestMapping("/ribbon.do")
public String ribbonTest(@RequestParam("count") Integer count){
logger.info("provider>>> "+count+" <<<eureka-client-provider-one-8762");
return "provider的ribbon测试";
} @RequestMapping("/option.do")
public List<Dept> optionData() {
return deptService.optionData();
} @RequestMapping("/data.do")
public List<Map<String, Object>> showData(@RequestBody Emp emp) {
return empService.showData(emp);
}
}

CenterController.java

3.10 启动类的设置

 package cn.kgc;

 import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @MapperScan("cn.kgc.mapper")
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientProviderEmpdeptOneApplication { public static void main(String[] args) {
SpringApplication.run(EurekaClientProviderEmpdeptOneApplication.class, args);
} }

启动类

3.11 编写属性文件

 spring.application.name=provider-empdept

 server.port=8762

 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.117.145:3306/kh66
spring.datasource.username=root
spring.datasource.password=ok mybatis.type-aliases-package=cn.kgc.vo mybatis.mapper-locations=classpath:mapper/*.xml

application.properties

3.12 启动eureka-server、eureka-client-provider-empdept-one 查看结果

springcloud(十四)、ribbon负载均衡策略应用案例

springcloud(十四)、ribbon负载均衡策略应用案例

四、创建eureka-client-provider-empdept-two提供者项目,所有的代码模块和eureka-client-provider-empdept-one一模一样,只是端口号不一样即可

五、创建eureka-client-consumer-empdept-p-one消费者项目,

5.1 结构如下

springcloud(十四)、ribbon负载均衡策略应用案例

5.2 编写 EmpDeptProviderFeign.java

 package cn.kgc.fegin;

 import cn.kgc.vo.Dept;
import cn.kgc.vo.Emp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import java.util.List;
import java.util.Map; @FeignClient("provider-empdept")
public interface EmpDeptProviderFeign { @RequestMapping("/ribbon.do")
public String ribbonTest(@RequestParam("count") Integer count); @RequestMapping("/option.do")
public String optionData(); @RequestMapping("/data.do")
public String showData(@RequestBody Emp emp);
}

EmpDeptProviderFeign.java

5.3 CenterController.java

 package cn.kgc.fegin;

 import cn.kgc.vo.Dept;
import cn.kgc.vo.Emp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import java.util.List;
import java.util.Map; @FeignClient("provider-empdept")
public interface EmpDeptProviderFeign { @RequestMapping("/ribbon.do")
public String ribbonTest(@RequestParam("count") Integer count); @RequestMapping("/option.do")
public String optionData(); @RequestMapping("/data.do")
public String showData(@RequestBody Emp emp);
}

CenterController.java

5.4 application.properties属性文件编写

 spring.application.name=consumer-empdept-p-one

 server.port=8764

 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

application.properties

5.5 编写启动类

 package cn.kgc;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.openfeign.EnableFeignClients; @EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientConsumerEmpdeptPOneApplication { public static void main(String[] args) {
SpringApplication.run(EurekaClientConsumerEmpdeptPOneApplication.class, args);
} }

启动类

5.6  启动项目顺序为:eureka-server、eureka-client-provider-empdept-one、eureka-client-provider-empdept-two、eureka-client-consumer-empdept-p-one

因为没有设置负载均衡策略,因此他会按照默认方式既 轮询策略进行调用,

springcloud(十四)、ribbon负载均衡策略应用案例

springcloud(十四)、ribbon负载均衡策略应用案例

springcloud(十四)、ribbon负载均衡策略应用案例

5.7 再次选择配置ribbon负载均衡策略为随机分配,再看效果,属性文件设置如下

 spring.application.name=consumer-empdept-p-one

 server.port=8764

 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

 #随机分配策略
provider-empdept.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

application.properties

5.8 再次按照刚才的启动顺序启动,再来查看

springcloud(十四)、ribbon负载均衡策略应用案例

springcloud(十四)、ribbon负载均衡策略应用案例

springcloud(十四)、ribbon负载均衡策略应用案例

可以挨个把负载均衡策略试一下