服务发现
整个微服务架构中,整个系统会按职责能力划分多个服务,通过服务之间的写作实现业务目标。
在这个过程中无法避免的需要服务之间的远程调用。
在微服务环境中,由于服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化 ,因此无法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中心来获取访问目标服务的网络地址,从而实现服务发现的机制。
负载均衡
负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。
在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。
Ribbon,就属于客户端负载均衡。在ribbon客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。
Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。Feign的英文表意为“假装,伪装,变形”, 可以理解为将HTTP报文请求方式伪装为简单的java接口调用方式。
服务发现中心例子(生产方、消费方)
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
生产者:
server:
port: ${port:56010}
spring:
application:
name: quickstart-producer
#暂时只用得着服务发现,不需要配置那么多
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: ed22de1f-e63c-4947-8fae-641fe49aa556
cluster-name: DEFAULT
logging:
level:
root: info
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
@RestController
public class ProducerController {
@GetMapping("/service")
public String service() {
return "producer invoke;";
}
}
消费者:
server:
port: 56020
spring:
application:
name: quickstart-consumer
#暂时只用得着服务发现,不需要配置那么多
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: ed22de1f-e63c-4947-8fae-641fe49aa556
cluster-name: DEFAULT
logging:
level:
root: info
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@FeignClient(value = "quickstart-producer") //生产者的名称
public interface ProducerClient {
//注意是同名且同mapping
@GetMapping("/service")
public String service();
}
@RestController
@Slf4j
public class ConsumerController {
@Autowired
private ProducerClient producerClient;
@GetMapping("/service")
public String service() {
log.info("consumer invoke;");
String producerResult = producerClient.service();
return "consumer invoke; || " + producerResult;
}
}
多实例负载均衡。模拟地址动态(多端口):
server:
port: ${port:56010}
然后修改VM option里为-Dport=56011
可以复制多个Configuration来模拟
