您的位置:首页 > 编程语言 > Java开发

springcloud笔记3:Ribbon和负载均衡,Feign

2020-07-18 04:22 344 查看

使用Ribbon:实现客户端对服务器端的访问。
1.确定服务提供者spring-cloud-provider-dept-8001和消费者consumer-dept-80中导入的有Eureka和Ribbon的包
provider->pom.xml

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

consumer->pom.xml

<!--        ribbon负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<!--        Eureka注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

2.编写配置文件

server:
port: 80

#Eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
register-with-eureka: false  #不向eureka中注册自己

3.开启注解

@SpringBootApplication
@EnableEurekaClient//开启Ribbon
public class DeptConsumer_80 {

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

}

4.把restTemplate的前缀地址改成Eureka中心实例名。
DeptConsumerController.java

//    private static final String REST_URL_PREFIX = "http://localhost:8001";
//    把这里写成服务提供方配置的spring.name,也是在Eureka中注册的实例地址,应该是变量,通过服务器提供方的注册地址去找.
//注意:要加http://
private static final String REST_URL_PREFIX = "http://springcloud-provider-dept";

模拟多服务器,多数据库运行
1.复制三份相同数据库,名称不同。

2.复制多个服务提供者springcloud-provider-dept-8001/8002/8003…

需要修改的地方:
application.yml中的port和数据库名称,和主启动类的名称!

server:
port: 8003

#mybatis的配置
mybatis:
type-aliases-package: com.aruiea.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#  spring的配置
spring:
application:
name: springcloud-provider-dept  #三个服务的名称一致是进行负载均衡的基础
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db03?useUnicode=true&serverTimezone=GMT&characterEncoding=UTF-8
username: root
password: 123456

#Eureka配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
instance-id: springcloud-provider-dept8003  #修改eureka上默认实例的描述

#info配置
info:
app.name: aruiea-springcloud
company.name: blog.aruieaStudy.com
//主启动器
@SpringBootApplication
@EnableEurekaClient//服务启动后,自动注册到Eureka中。默认和服务注册中心是CS关系。
@EnableDiscoveryClient//开启服务发现。
public class DeptProvider_8003 {

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

}

3.启动Eureka,访问实现轮询。

不能轮询
PS:是因为mapper.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.aruiea.dao.DeptDao">
<insert id="addDept" parameterType="Dept">
insert into dept(dname,db_source)
values (#{dname},DATABASE());
</insert>

<select id="queryDeptById" resultType="Dept" parameterType="Long">
select * from dept where deptno = #{deptno};
</select>

<select id="queryAll" resultType="dept">
select * from dept;
</select>
</mapper>

自定义负载均衡算法
新建一个AruieaRule类

@Configuration
//自定义负载均衡
public class AruieaRule {

//配置负载均衡实现RestTemplate
//IRule接口
//子类:RoundRobinRule轮询
//RandomRule 随机
//AvailabilityFilteringRule:过滤掉所有跳闸,访问故障的,对剩下的轮询
//RetryRule:先按照轮询获取服务,获取失败就重试

@Bean
public IRule myRule(){
return new RandomRule();
}

}

就可以了!!!
重点:

RestTemplate可以访问获得远程服务器访问地址,负载均衡的开启注解就在这里。@LoadBalance

ConfigBean

@Configuration
public class ConfigBean {

//    把新的类托管到spring中,然后通过autowired注入使用
@Bean
@LoadBalanced //Ribbon的使用
public RestTemplate getRestTemplate(){
return new RestTemplate();
}

}

也可以在启动类上加入自己配置的其他Ribbon配置。

@SpringBootApplication
@EnableEurekaClient//开启ribbon
//微服务启动时,就导入我们配置的Ribbon配置文件
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = AruieaRule.class)
public class DeptConsumer_80 {

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

}

Feign实现负载均衡
1.导入Feign启动包
springcloud-api和consumer客户端pom.xml下。

<!--        导入Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>

2.新建包和类。
springcloud-api中新建service层,创建Feign配置文件。

3.编写Feign配置类

@Component//加入到Spring组件中
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")//微服务名称
public interface DeptClientService {
//用this.service.方法调用远程服务器。相当于springcloud-api就是一个总接口。
//通过接口调用远程服务器url,实现相关业务处理。
@GetMapping("/dept/get/{id}")
Dept queryById(@PathVariable("id") Long id);

@GetMapping("/dept/list")
List<Dept> queryAll();

@PostMapping("/dept/add")
boolean addDept(Dept dept);
}

4.编写consumer的Controller层调用this.service公用业务层。

@RestController
public class DeptConsumerController {

//如何能调用到业务层?消费者不应该有service层。
//使用Feign
@Autowired
private DeptClientService service = null;

@RequestMapping("/consumer/dept/add")
public boolean add(Dept dept){
return this.service.addDept(dept);
}

@RequestMapping("/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return this.service.queryById(id);
}

@RequestMapping("/consumer/dept/list")
public List<Dept> list(){
return this.service.queryAll();
}
}

5.主启动类上开启注解。

@SpringBootApplication
@EnableEurekaClient//开启ribbon
@EnableFeignClients(basePackages = {"com.aruiea"})//扫描包下的FeignClent   @ComponenScan("com.aruiea")已经自动被springboot集成了
public class FeignDeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(FeignDeptConsumer_80.class,args);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: