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中可以有多个namespacenamespace下可以有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方式

查看原文