clúster de proveedores y cinta de equilibrio de carga
Previous: Registro de Feign
Siguiente: Use zuul para construir una puerta de enlace de microservicios
clúster de proveedores.
Utilizo el segundo método de inicio. Modifique el archivo de configuración application.yml, o use-para separar los diferentes archivos en el archivo de la siguiente manera:
#当前项目启动端口
#server:
# port: 8000
#连接数据库的信息
# generate-ddl: false 取消让它自动见数据库
# show-sql: true展示sql
spring:
jpa:
generate-ddl: false
show-sql: true
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&useSSL=true
driver-class-name: com.mysql.jdbc.Driver
#当前启动的名字
profiles:
active: provider2
# application:
# name: springcloud-provider
info:
head: head
body: body
app:
name: @project.artifactId@
encoding: @project.build.sourceEncoding@
java:
source: @java.version@
target: @java.version@
management:
endpoints:
web:
exposure:
#加载所有的端点,默认只加载了info、health
include: '*'
endpoint:
health:
show-details: always
#可以关闭指定的端点
shutdown:
enabled: false
eureka:
client:
service-url:
defaultZone: http://root:root@peer1:8761/eureka/,http://root:root@peer2:8762/eureka/
instance:
prefer-ip-address: true
# virtual-host-name: provider
---
spring:
profiles: provider1
application:
name: provider
server:
port: 8000
---
spring:
profiles: provider2
application:
name: provider
server:
port: 8001
Después del inicio,
pruebe si el proveedor brinda servicios normalmente
http: // localhost: 8000 / user / 2
http: // localhost: 8001 / user / 2
está registrado en el componente de descubrimiento de servicios, como se muestra en la figura
Cinta de equilibrio de carga
Venga una solicitud, asigne la solicitud al consumidor del servicio correspondiente para hacer una solicitud, juzgue qué proveedor para obtener los datos y devuelva los datos:
1 paquete jar, que se ha introducido en eureka-client.
2 Agregue la anotación @LoadBalanced a restTemplate en la clase principal de inicio
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumerApplication.class, args);
}
}
Modifique la ruta de acceso del consumidor. Una vez que el proveedor haya completado el clúster, el archivo de configuración ha cambiado. Solo se puede acceder a él a través del nombre de la aplicación del proveedor (también llamado serviceId), que es el del proveedor como se muestra en la figura:
Modificar el UserController del consumidor El camino es el siguiente:
@RequestMapping("/user/{id}")
public User findUserById(@PathVariable("id") Integer id){
//消费者,调用生产者
// User user = restTemplate.getForObject(userServiceUrl+id,User.class);
User user = restTemplate.getForObject("http://provider/"+id,User.class);
return user;
}
El consumidor de prueba visita al proveedor
Cuatro veces de la siguiente manera: los dos proveedores llaman cada uno dos veces El
equilibrio de carga predeterminado es el sondeo (vacié la consola para mayor intuición). No es lo mismo que el aleatorio predeterminado de Dubbo.
Tipos de algoritmos de equilibrio de carga
El componente principal de Ribbon es IRule, que es la interfaz principal de todos los algoritmos de equilibrio de carga. Sus subclases son:
RoundRobinRule Sondeo
RandomRule RandomRule Random
AvailabilityFilteringRule primero filtrará los servicios que están en el estado de disparo del interruptor debido a múltiples fallas de acceso, así como los servicios cuya cantidad de conexiones simultáneas excede el umbral, y luego sondeará la lista de servicios restante.
Los pesos de WeightedResponseTimeRule se basan en el tiempo de respuesta promedio Calcule los pesos de todos los servicios, cuanto más rápido sea el tiempo de respuesta, mayor será el peso del servicio, mayor será la probabilidad de ser seleccionado. Al
principio , si la información estadística es insuficiente, se utiliza la estrategia de sondeo, y cuando la información es suficiente, se cambia a WeightedResponseTimeRule RetryRule Reintentar para obtener el servicio de acuerdo con la estrategia de sondeo primero, si la adquisición falla, reintentar dentro del tiempo especificado para obtener el servicio disponible
BestAvailableRule Select filter
Elimine el servicio que se encuentra en el estado de disparo del interruptor debido a múltiples fallas de acceso y luego seleccione un servicio con la menor concurrencia, ZoneAvoidanceRule, que cumpla con el rendimiento del área donde se encuentra el servidor y la disponibilidad del servidor.
Algoritmo de equilibrio de carga de configuración personalizada
Hay dos maneras
Uno, configuración JAVA
La configuración es sencilla
public class SpringcloudConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
/**自定义配置ribbon负载均衡算法
* @return
*/
@Bean
public IRule myRule(){
// return new RoundRobinRule();//轮询
return new RandomRule();
// return new RetryRule();//重试
// return new BestAvailableRule();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumerApplication.class, args);
}
}
Los resultados de la entrada de la consola del proveedor (aleatorio) son los siguientes: He
visitado ocho veces y los
demás se enumeran uno por uno.
Puede seleccionar el algoritmo apropiado para requisitos comerciales específicos, por supuesto, puede escribir una clase de algoritmo basada en requisitos comerciales específicos.
Utilice archivos de configuración para implementar estrategias de equilibrio de carga
Dos, configuración de atributos
Agregue el archivo de configuración en el proyecto del consumidor
#指定负载均衡策略
springcloud-consumer:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
prioridad de configuración de cinta: prioridad de configuración de cinta: configuración de propiedad> configuración de JAVA configuración de
Java configuración de
propiedad
Siga la votación de la siguiente manera:
La configuración de la cinta está casi completa.
Salida de registro
Utilice registros en la capa del controlador del proyecto del consumidor.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(User.class);
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private UserFeignClient userFeignClient;
@Autowired
private RestTemplate restTemplate;
@Value("${user.userServiceUrl}")
private String userServiceUrl;
@RequestMapping("user/{id}")
public User findById(@PathVariable("id") Integer id){
return restTemplate.getForObject("http://provider/user/"+id, User.class);
// return restTemplate.getForObject(userServiceUrl+id,User.class);
}
@GetMapping("/log")
public void logUserInstance(){
//虚拟主机名
ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider");
this.logger.info("{}:{}:{}", serviceInstance.getInstanceId(),serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getInstanceId());
}
}
Prueba:
cuando visite al proveedor, el proveedor imprimirá la dirección de host del puerto y así sucesivamente.