NACOS

一 、注册中心原理

在微服务架构中,注册中心是最核心的基础服务之一

二、注册中心主要涉及到三大角色:

        服务提供者 ---生产者

        服务消费者 ---

        服务发现与注册

它们之间的关系大致如下:

        各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。

        服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

        各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

        微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。

三、常见的注册中心

1.Zookeeper

zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式

应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用

配置项的管理等。

2.Eureka

Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭

3.Consul

Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现

和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value

存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以

安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。

4.Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring

Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。

 

四、Nacos简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速

实现动态服务发现、服务配置、服务元数据及流量管理。

从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务

 五、安装Nacos

        1.下载Nacos

                下载地址: Releases · alibaba/nacos · GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Releases · alibaba/nacosicon-default.png?t=N7T8https://github.com/alibaba/nacos/releases

                下载zip格式的安装包,然后进行解压缩操作

                1.4.1的下载地址是:        

https://github.com/alibaba/nacos/releases/tag/1.4.1icon-default.png?t=N7T8https://github.com/alibaba/nacos/releases/tag/1.4.1

        2.使用nacos

                在windows里面 进入bin目录里面

                执行一个命令 startup.cmd -m standalone

                执行成功如下图:

通过localhost:8848/nacos登录访问

 如图所示配置成功。

3.将服务注册到注册中心

1.在项目pom文件里加入依赖

代码如下:

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 微服务注册到nacos

代码如下:

将对应的服务注册到注册中心里面
# 注册到注册中心里面  localhost:8848
# nacos 服务的地址在哪里
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 微服务的名字
spring.application.name=order

如果微服务的IP地址显示的是以1 为最后一位的话 直接将对应的虚拟机的网卡禁用即可

禁用下图中两个

注解的作用是 当前的微服务可以被nacos发现

微服务里面写两个一模一样的项目(端口号不一样)注册到nacos里面

 如上图所示,配置成功

六、负载均衡

        1.什么是负载均衡

                通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上 进行执行。

        2.使用负载均衡

                Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进

                使用的时候必须加jar

                代码如下:

                

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

        3.轮询代码

@Resource
private LoadBalancerClient loadBalancerClient;

// 根据服务的名字获取服务的网络的信息
@GetMapping("addOrder2/{pid}")
public Object addOrder2(@PathVariable Integer pid){
    ServiceInstance choose = loadBalancerClient.choose("pro");
    String requestMsg = "方式二 GET 请求 RibbonServer";
    String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
    System.out.println(url);

    // 1. 根据pid 得到商品的信息
    Product forObject = restTemplate.getForObject(url, Product.class);
    //  实现远程的调用
    // map
    //  product : 分布式部署
    // localhost:8083 pro
    // 思考82 和83 之前进行轮询调用
    return forObject;
}

        4.随机

@Resource
private DiscoveryClient discoveryClient;// 发现客户端


@GetMapping("addOrder3/{pid}")
public Object addOrder3(@PathVariable Integer pid){
    List<ServiceInstance> pro = discoveryClient.getInstances("pro");
    //
    int size = pro.size();
    //
    int i = new Random().nextInt(size);// =size-1
    ServiceInstance choose = pro.get(i);


    String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
    System.out.println("*****"+url);

    // 1. 根据pid 得到商品的信息
    Product forObject = restTemplate.getForObject(url, Product.class);
    //  实现远程的调用
    // map
    //  product : 分布式部署
    // localhost:8083 pro
    // 思考82 和83 之前进行轮询调用
    return forObject;
}

七、OpenFeign 组件之间的调用

        默认负载均衡的策略就是一个轮询

1.加jar

<!--使用openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.开始使用openfeign

        启动类上面开启使用openfeign

3.微服务之间的调用

4.Controller调用

@Resource
private ProFeign proFeign;

@GetMapping("feignOrder/{id}")
public Product getProById(@PathVariable Integer id){
    Product proById = proFeign.getProById(id);
    return proById;

}

5.更改策略:

        5.1加配置文件

        

package com.example.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class LoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name
        // 对应的需要进行负载均衡的名字是什么
        System.out.println("======"+name);
        // product
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

5.2在启动类上加注解使用这个策略

 前面箭头是服务的名字,后面箭头是服务的类

5.3启动微服务调用一下路径

5.4服务熔断:

        5.4.1加jar
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
        5.4.2写一个实现类
package com.example.service;

import com.example.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;

@Service
public class ProFeignImpl implements ProFeign {
    @Override
    public Product getProById(Integer id) {
        return new Product(0,"出错啦");
    }
}
        5.4.3之前的接口上加一个fallback

        5.4.4开启feign对sentinel的支持

        在消费者的application.properties文件里面加上如下代码:

feign.sentinel.enabled=true

八、注意事项

        要求JDK1.8及以上!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值