文章目录
微服务远程调用
在需要远程调用的微服务的启动类中注入RestTemplate.
@SpringBootApplication
public Class OrderApplication{
public static void main(String args){
SpringApplication.run(OrderApplication.class,args)
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在Service上使用restTemplate.getForObject(url,Class)方法,进行远程调用.
@AutoWired
private RestTemplate resttemplate;
public Order queryOrderById(String id){
//省略...
String url = "http://localhost:8080/user/"+order.getUserId();
User user = restTemplate.getForObject(url,User.class);
//省略...
}
注册中心
Eureka
搭建EurekaServer注册中心
- 在服务端项目中导入EurekaServe的启动器依赖.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 在EurekaServer项目的配置文件中配置Eureka地址信息,及应用信息
server:
port: 10000
spring:
application:
name: EurekServer
eureka:
client:
serviec-url:
defaultZone: http://127.0.0.1:10000/eureka/
- 在启动类上添加
@EnableEurekaServer
注解,启用EurekaServer.
注册微服务
1.在微服务项目的pom文件中引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在项目的application.yml文件中配置应用名称和Eureka注册中心地址
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10000/eureka/
3.在启动类上添加@EnableDiscovery
开启发现,并在注入RestTemplate时,添加负载均衡@LoadBalanced
注解
@SpringBootApplication
@EnableDiscovery
public Class OrderService{
public static void main(String args){
SpringApplication.run(OrderService.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.在远程调用方法上中将url地址中的主机名+服务端口改成服务名称,服务地址不用再写死.
修改前:String url = "http://localhost:8080/user/"+order.getUserId();
修改后:String url = "http://userservice/user/"+order.getUserId();
Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
安装及启用Nacos服务
- 下载Nacos
- 解压至非中文路径
- 修改配置信息
3.1 单机环境仅需要修改
3.2 集群环境需要修改端口号,数据库连接信息,及创建Nacos数据库及数据表 - 启动Nacos
4.1 单机环境启动运行startup.cmd -m standalond
4.2 集群环境直接运行startup.cmd
即可
注册到Nacos服务
- 在父项目中添加spring-cloud-alibaba的管理依:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 在微服务的pom文件中引入NacosDiscovery依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改配置文件,将服务注册到Nacos
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos服务端地址
Nacos集群
服务调用尽可能选用本地集群的服务,跨集群调用延迟较高,
需求:优先访问本地集群,当本地集群不可访问时,再调用其他集群.
指定集群
通过spring.cloud.nacos.discovery.cluster-name:BJ
属性指定服务所在集群名称或者是机房位置
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
cluster-name: BJ #指定集群名称或机房位置
根据集群负载均衡
需要设置负载均衡规则为:com.alibaba.cloud.nacos.ribbon.NacosRule
Nacos环境隔离 namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离.
不同namespace下的服务互相不可见
每个namespace都有唯一的ID
创建namespace
在Nacos控制台新建命名空间,用来隔离不同环境
指定命名空间
在微服务的配置文件中通过spring.cloud.nacos.discovery.namespace:xxxxxx
属性指定服务所在的命名空间,值为namespace的ID,而不是名称.
spring:
cloud:
nacos:
discovery:
cluster-name: BJ #指定集群名称,或机房位置
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 #指定命名空间namespace
负载均衡
Robbin
在注入RestTemplate对象时,添加的@LoadBalanced
注解,在通过RestTemplate做远程调用时,Robbin会自动拦截发送的请求,向EurekaServer拉去服务列表后,并通过IRule接口的实现规则,完成负载均衡,再向选中的实例发起请求.
内置的负载均衡策略
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule (默认方案) | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
修改负载均衡策略
- 通过代码方式修改,在启动类中定义一个新的IRule,并注入
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 修改微服务配置文件,指定调用某个微服务时采用的负载均衡策略
userservice:
robbin:
NFLoadBalancedRuleClassName: com.netflix.loadbalanced.RandomRule.
区别:
采用代码的注入IRule的方式为全局策略,该微服务下远程调用所有的微服务对象均采用注入的规则.
采用配置文件的方式仅针对某个远程调用某个微服务时生效.
Robbin的加载方式
robbion默认为懒加载方式,当首次远程调用微服务时,LoandBalancedClient才会加载,会导致首次远程调用用时过长.可以修改为饥饿加载方式.(需要指定采用饥饿加载方式的微服务)
ribbon:
eager-load:
enable: true #启用饥饿加载
clients: userservice #指定采用饥饿加载的服务