1.服务拆分和远程调用
任何分布式架构都离不开服务的拆分,微服务也是一样。
1.1.服务拆分原则
这里我总结了微服务拆分时的几个原则:
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
1.2.实现远程调用案例

1.3注册RestTemplate
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
实现远程调用

服务注册后将ip地址和端口号改成项目名称就好了

2.Ribbon负载均衡
2.1.负载均衡策略

 不同规则的含义如下:
| 内置负载均衡规则类 | 规则描述 | 
|---|---|
| RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 | 
| AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。 | 
| WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 | 
| ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 | 
| BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 | 
| RandomRule | 随机选择一个可用的服务器。 | 
| RetryRule | 重试机制的选择逻辑 | 
默认的实现就是ZoneAvoidanceRule,是一种轮询方案
2.1.1自定义负载均衡策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:
- 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
- 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 
注意,一般用默认的负载均衡规则,不做修改。
3.Nacos环境配置
spring:
  cloud:
    nacos:
      server-addr: localhost:8848  #连接nacos地址
      discovery:
        cluster-name: HZ  #配置集群
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
3.1权重配置
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
 
 在弹出的编辑窗口,修改权重:
 
注意:如果权重修改为0,则该实例永远不会被访问
3.2环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

3.2.1创建namespace
默认情况下,所有service、data、group都在同一个namespace,名为public:

 我们可以点击页面新增按钮,添加一个namespace:
 
 然后,填写表单:
 
 就能在页面看到一个新的namespace:
 
3.2.2 给微服务配置namespace
给微服务配置namespace只能通过修改配置来实现。
例如,修改order-service的application.yml文件:
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
重启order-service后,访问控制台,可以看到下面的结果:
 
 
 此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:
 
3.3 nacos与eureka的区别
-  Nacos与eureka的共同点 - 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
 
-  Nacos与Eureka的区别 - Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
 













![[Leetcode] 0705. 设计哈希集合](https://img-blog.csdnimg.cn/img_convert/1ae0a7e423eb5000858b85acd161be50.png)





