负载均衡策略
微服务架构的应用之进行远程调用时,需要写一长串的地址并拼接上自己的参数。
问题:地址过长,确式的服务调用地址,若为集群应用则过于麻烦且需频繁修改已应对服务器宕机不可用出bug等等问题。
确定式的硬编码来实现远程调用,灵活性差。
参数拼接,地址长度限制,不符合面向对象直接调用方法的编程习惯。
解决:nacos注册中心,服务注册,提供服务查询,监测服务状态“心跳”(30 90 不可用 注销服务)。服务提供接口的地址和参数等信息,调用方从中心查询所需服务。
openfeign简化远程调用,提供就像调用本地对象的方法一样的远程调用。内置ribbon,远程调用时自动负载均衡,可调整负载均衡策略也可自定义。
nacos
下载软件,修改bin/startup.cmd,有默认的集群模式改为单体,cluster->standalone.双击运行,黑窗口不能关,关就停。
网站localhost:8848 初始密码与用户均为nacos。应用配置启动完成就会出现在应用列表中。
idea图形化启动应用集群,springboot应用启动,编辑朱启动类的运行配置-》修改选项-》添加VM选项,修改端口号等。
springboot springcloud springcloud-alibaba nacos版本应对应。
偷懒版 2.2.0.RELEASE (springboo系jar包都相同) HOXTON.SR12(只有SPRINGCLOUD搞特殊)。2.2.8.RELEASE(ali)
父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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>sc4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sc4</name>
<description>sc4</description>
<modules>
<module>s5</module>
<module>s6</module>
</modules>
<properties>
<java.version>8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>
1.18.24
</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.2.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!--springweb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>
2.5.4
</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
子
<?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>
<parent>
<groupId>com.example</groupId>
<artifactId>sc4</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>s5</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.2.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!--springweb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version> 2.2.0.RELEASE</version>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
</project>
openfeign
一个接口,一个注解
谁想调用其他的,谁就写restTemplateConfig,接口代理类和属性文件。
主启动类加@EnableFeignClient注解,接口类注解@FeignClient注解。都得相同,路径写全,即浏览器上的全路径,但去掉协议IP端口。
调用时导入接口类,就可以直接调用方法,方法括号填相应参数。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "s5")
public interface RandomApi {
@GetMapping("/random/str")
public String randomStr();
}
局部策略设置(属性文件)s5.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.BestAvailableRule
全局策略
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
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 RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
/*IRule全局策略*/
public IRule iRule(){
return new RandomRule();
}
}
resttemplate负载均衡需加@LoadBalanced注解。