2021-06-08-服务注册与发现nacos


  昵称过于强大无法显示      87   
  2021-06-09      Java      

传统的rpc远程调用中存在哪些问题

  • 1、超时的问题
    2、安全的问题
    3、服务与服务之间URL地址管理

服务治理基本的概念

  • 在我们微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的url地址的情况下,一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址。
    每个服务的url管理地址发出复杂,所以这是我们采用服务url治理技术,可以实现对我们整个实现动态服务注册与发现、本地负载均衡、容错等。
    2021-06-08-服务注册与发现nacos - 第1张

服务注册中心的概念

  • 每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以该接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。

  • 注册中心:我们的服务注册到我们注册中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos等。
    服务注册:我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

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

微服务调用接口常用名词

  • 生产者:提供接口被其他服务调用
    消费者:调用生产者接口实现消费
    服务注册:将当前服务地址注册到注册中心
    服务发现:

    2021-06-08-服务注册与发现nacos - 第2张

  • 服务注册原理实现:
    1、生产者启动的时候key=服务站的名称 value ip 和端口号 注册到我们的微服务注册中心上。
    Mayikt-member 192.168.212.110:8080
    Mayikt-member 192.168.212.110:8081 2、注册存放服务地址列表类型:key唯一,列表是list集合。
    May<Key,List(String)>
    {
    Mayikt-member:[“192.168.212.110.8080”]
    } 3、我们的消费者从我们注册中心上根据服务名称查询服务地址列表(集合)
    Mayikt-member===[“192.168.212.110.8080” “192.168.212.110.8081”] 4、消费者获取到集群列表之后,采用负载均衡器选择一个地址实现远程调用

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

  • 在官网下载个压缩包,下载源码也行,随你,官网有介绍,我这里下载压缩包

  • 解压后,双击启动start.cmd或start.sh,注意nacos的环境要求jdk1.8以上,且解压目录不能有中文路径

    2021-06-08-服务注册与发现nacos - 第3张

  • 运行起来后访问localhost:8848/nacos,就可以进到首页了

    2021-06-08-服务注册与发现nacos - 第4张

Nacos整合SpringCloud

  • 可以建一个父类maven项目,然后建两个子模块当成两个服务,也可以单独建两个项目当成两个服务

  • Maven依赖信息(两个服务都要用这个依赖)

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.0.RELEASE</version>
 </parent>
<dependencies>
    <!--  springboot 整合web组件-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>
</dependencies>

会员服务(生产者)

  • 服务接口
@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<ServiceInstance> 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;
   }

}
  • 新建项目之后,第一步,根据服务名称从 注册中心获取集群列表地址
    ;第二步,根据列表任意选择一个 实现本地远程调用rest

负载均衡算法

  • 这个代码写在消费者端

  • 接口

public interface LoadBalancer {

    /**
     * 根据多个不同的地址 返回单个调用rpc地址
     *
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}
  • 实现
@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
        int index = atomicInteger.incrementAndGet() % 2;
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}
  • 加了本地负载均衡后订单服务的代码改成这样
@RestController
public class OrderService {

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

    /**
     * 订单调用会员服务
     *
     * @return
     */
//    @RequestMapping("/orderToMember")
//    public String orderToMember() {
//        // 从注册中心上获取该注册服务列表
//        List<ServiceInstance> 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<ServiceInstance> 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;
    }
}

作者:热爱Java的程序猿

ps:以上是2021-06-08-服务注册与发现nacos全部内容,希望文章能够帮你解决2021-06-08-服务注册与发现nacos所遇到的游戏开发问题。
本文收录在 游戏编程 🕹️ - 学习Java专题,分享走一走~

猜你喜欢 全系列


您可以在登录后,发表评论