1.nacos产生背景

在微服务通讯时,服务与服务之间的依赖非常大,每个服务的url管理地址较为复杂。所以采用服务治理技术来实现对整个服务的动态注册与发现,本地负载,容错等。


2.注册中心作用

管理服务的url地址

3.注册中心有哪些

dubbo依赖zookeeper
eureka
consuler
nacos
 

4.nacos基本介绍

实现注册中心和分布式配置中心
默认端口号8848

5.负载均衡算法

hash一致性
轮询
权重
随机

6.CAP概念

C:一致性:在分布式系统中,服务器集群情况下,每个节点同一时刻查询的数据必须保持一致

A:可用性:在分布式系统中,服务器集群情况下,部分节点出现故障后仍然可以继续访问

P:分区容错性:在分布式系统中,网络波动是无法避免的

7.eureka与zookeeper、nacos注册中心区别

zookeeper采用CP保证数据一致性问题。出现宕机的情况下会重新选举。在选举的过程中会出现短暂的无法使用

eureka采用AP。去中心化思想

nacos支持两种模式,CP和AP  默认是AP模式

8.什么是中心化和去中心化

中心化:必须围绕一个领导角色为核心
去中心化:每个角色都是均等的


9.启动nacos服务

1)nacos下载地址

链接:https://pan.baidu.com/s/1jhUs3HDvZ2nOS98betJhHA 
提取码:ho6a

2)启动nacos

3)访问naocs

http://localhost:8848/nacos/

账号:nacos

密码:nacos

10.搭建生产者

链接:https://pan.baidu.com/s/14uBv9WRh_LaS2wbSFO-Icw 
提取码:2f8k

1)pom依赖 

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

2.yml配置

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

3)定义接口

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberService {

    @Value("${server.port}")
    private String serverPort;

    /**
     * 会员服务提供的接口被订单服务调用
     * @return
     */
    @GetMapping("/getUser")
    public String getUser() {
        return "会员服务,端口号为:" + serverPort;
    }
}

4)启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppMember {
    public static void main(String[] args) {
        SpringApplication.run(AppMember.class);
    }
}

5)测试

http://localhost:8080/getUser?userId=1

8.消费者搭建

链接:https://pan.baidu.com/s/1r08dwg_b3uxfeT3pZ8ucHQ 
提取码:wnfz

1)pom依赖 

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

2)yml配置

spring:
  application:
    ###服务的名称
    name: nacos-order
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8090

3)消费者

import com.demo.loadbalancer.LoadBalancer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.List;

@RestController
public class OrderService {

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

    /**
     * 订单服务调用到我们的会员服务接口
     * @return
     */
    @RequestMapping("/orderToMember")
    public Object orderToMember() {
        // 1.根据服务名称从 注册中心获取集群列表地址
        List<ServiceInstance> instances = discoveryClient.getInstances("nacos-member");
        // 2.列表任意选择一个 实现本地rpc调用 rest 采用我们负载均衡的算法
        ServiceInstance srviceInstance = loadBalancer.getSingleAddres(instances);
        URI rpcMemberUrl = srviceInstance.getUri();
        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
        return "订单调用会员返回结果:" + result;
    }
}

4)负载均衡接口

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

/**
 * 负载均衡算法接口
 */
public interface LoadBalancer {
    /**
     * 从注册中心集群列表中获取单个地址
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}

5)负载均衡轮询实现

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 通过轮询实现负载均衡算法
 */
@Component
public class RotationLoadBalancer implements LoadBalancer {
    /**
     * 从0开始计数
     */
    private AtomicInteger atomicInteger = new AtomicInteger(0);

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

6)启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class AppOrder {

    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

7)测试

http://localhost:8090/orderToMember

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐