71 nacos 实现微服务的注册与发现

1 微服务架构服务治理的概念

2, 基于nacos实现服务注册与发现

3, 使用Rest模板实现RPC调用

4,手写Rpc 客户端负载均衡算法。

SpringCloud 与SpringCloudlibaba的区别
SpringCloud rpc远程调用整合

1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+config组合
SpringCloud rpc 远程调用整合。
1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+cnfig组合
2,目的为了推广阿里云产品,如果使用了SpringCloudAlibaba 建议最好使用整个体系的产品。
mq,rocketmq
总结:
SpringcloudAlibaba 实际上对我们的SpringCloud 做扩展组件开发 nacos ,setata分布式解决框架, SchedulerX, Alibaba cloud OSS等,目的推广阿里云产品。
服务治理的基本概念:
服务治理的概念:
在rpc远程调用过程中,服务与服务之间依赖关系非常大,服务url地址管理非常复杂,所以,这时候需要对我们的服务的url实现治理,通过服务治理可以实现服务注册与发现,负载均衡,容错等。

服务注册中心的概念:
每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以改接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。
注册中心: 我们的服务注册到我们的注册中心,key为服务名称,value为该服务调用地址,该类型为集合类型。Eureka ,consul,zookeeper,nacos
服务注册: 我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

服务发现: 消费者从我们的注册中心上获取生产者调用的地址(集合),在使用负载均衡的策略获取集群中某个地址实现本地rpc远程调用。
微服务调用接口常用名词:

生产者: 提供接口被其他服务调用;
消费者: 调用生产接口实现消费

image.png

nacos的基本介绍:
nacos可以实现分布式服务注册与发现/分布式配置中心框架
官网介绍: https://nacos.io/zh-cn/docs/what-is-nacos.html
nacos的环境准备:
nacos可以在linux/windows/Mac
具体安装教程: https://nacos.io/zh-cn/docs/quick-start.html

手动实现服务注册与发现:
1.实现服务注册 发送post请求:

'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

2.实现服务发现

http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName

详细步骤操作:https://nacos.io/zh-cn/docs/quick-start.html

nacos整合SpringCloud;

maven依赖:


     org.springframework.boot
     spring-boot-starter-parent
     2.0.0.RELEASE
 

    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.cloud
        spring-cloud-starter-alibaba-nacos-discovery
        0.2.2.RELEASE
    



会员服务(生产者)
服务接口:

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;

    /**
     * 会员服务提供的接口
     *
     * @param userId
     * @return
     */
    @RequestMapping("/getUser")
    public String getUser(Integer userId) {
        return "每特教育,端口号:" + serverPort;
    }
}


服务接口

配置文件
application.yml文件


spring:
  cloud:
    nacos:
      discovery:
        ###服务注册地址
        server-addr: 127.0.0.1:8848
  application:
    name: mayikt-member
server:
  port: 8081

订单服务(消费者)
订单调用会员服务

@RestController
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private LoadBalancer loadBalancer;

    /**
     * 订单调用会员服务
     *
     * @return
     */
//    @RequestMapping("/orderToMember")
//    public String orderToMember() {
//        // 从注册中心上获取该注册服务列表
//        List serviceInstanceList = discoveryClient.getInstances("mayikt-member");
//        ServiceInstance serviceInstance = serviceInstanceList.get(0);
//        URI rpcMemberUrl = serviceInstance.getUri();
//        // 使用本地rest形式实现rpc调用
//        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
//        return "订单调用会员获取结果:" + result;
//    }
    @RequestMapping("/orderToMember")
    public String orderToMember() {
        // 从注册中心上获取该注册服务列表
        List serviceInstanceList = discoveryClient.getInstances("mayikt-member");
        ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
        URI rpcMemberUrl = serviceInstance.getUri();
        // 使用本地rest形式实现rpc调用
        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
        return "订单调用会员获取结果:" + result;
    }
}



负载均衡算法

public interface LoadBalancer {


    /**
     * 根据多个不同的地址 返回单个调用rpc地址
     *
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List serviceInstances);
}

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List serviceInstances) {
        int index = atomicInteger.incrementAndGet() % 2;
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}




Rpc 远程调用设计到本地负载均衡算法

1.从注册中心获取服务集群的列表
2.从列表选择一个 负载均衡算法有那些:
A.一致性hash计算
B.轮训 、权重
C.随机

你可能感兴趣的:(71 nacos 实现微服务的注册与发现)