SpringCloud Alibaba——2. Nacos服务注册

1. 简介

        Nacos前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单来说Nacos就是注册中心+配置中心的组合,等价于 Eureka + Config + Bus。所以,Nacos可以替代Eureka做服务注册中心,也可以替代Config做服务配置中心。

官网下载地址:https://github.com/alibaba/Nacos

进入GitHub之后,在下面有官网连接,如图:

SpringCloud Alibaba——2. Nacos服务注册_第1张图片

点击该该链接进入官网,如图:

SpringCloud Alibaba——2. Nacos服务注册_第2张图片

点击版本说明,进入版本选择

SpringCloud Alibaba——2. Nacos服务注册_第3张图片

2. Nacos安装与运行

前提:JDK8+maven环境

下载Nacos的server,解压到某个目录,直接在cmd控制台运行脚本即可,如图:

SpringCloud Alibaba——2. Nacos服务注册_第4张图片

回车只会,在控制台出现如下

SpringCloud Alibaba——2. Nacos服务注册_第5张图片

表示下载成功,运行成功。

验证:在浏览器输入如下网址:http://localhost:8848/nacos,出现下图所示,表示本地Nacos成功启动

SpringCloud Alibaba——2. Nacos服务注册_第6张图片

注意:默认账号密码都是nacos

登录进去如下图:

SpringCloud Alibaba——2. Nacos服务注册_第7张图片

3. Nacos作为服务注册中心

在父pom中引入springCloud Alibaba的坐标

SpringCloud Alibaba——2. Nacos服务注册_第8张图片

3.1 基于Nacos的服务提供者

1)新建工程cloudalibaba-provider-payment9001

2)修改pom,主要是添加Nacos坐标



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

完整的pom



    
        cloud2020
        com.bjc.cloud
        1.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-provider-payment9001

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        

        
        
            org.springframework.boot
            spring-boot-starter-test
        
    

3)yml配置文件

server:
  port: 9001

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848        # 配置Nacos地址
  application:
    name: nacos-payment-provider
management:
  endpoints:
    web:
      exposure:
        include: '*'

4)启动类

package com.bjc.cloud.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

5)业务测试类

package com.bjc.cloud.nacos.controller;

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

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

	@GetMapping("/payment/nacos/{id}")
	public String getPayment(@PathVariable("id") Integer id){
		return "nacos registry,serverport: " + serverPort + "\t  id = " + id;
	}
}

6)测试

启动9001,在浏览器输入:http://localhost:9001/payment/nacos/1,页面显示,如图:

SpringCloud Alibaba——2. Nacos服务注册_第9张图片

然后,查看Nacos控制台,如图:

SpringCloud Alibaba——2. Nacos服务注册_第10张图片

服务成功的注册进了Nacos

注意:Nacos自带负载均衡功能,所以,我们可以参考9001,新建一个9002

也可以使用一种偷懒的方式,在idea中直接复制一份,例如:

1)选择9001,右键,如图:

SpringCloud Alibaba——2. Nacos服务注册_第11张图片

2)在弹窗中输入如下命令参数(-DServer.port=9011),如图:

SpringCloud Alibaba——2. Nacos服务注册_第12张图片

3)点击apply,点击ok,在列表中就会出现刚才复制的配置工程了,如图:

SpringCloud Alibaba——2. Nacos服务注册_第13张图片

4)启动之,可以正常访问

5)然后再看Nacos控制台,如图:

SpringCloud Alibaba——2. Nacos服务注册_第14张图片

在启动新建的9002,查看Nacos,如图:

SpringCloud Alibaba——2. Nacos服务注册_第15张图片

查看详情,如图所示,三个服务都成功入驻Nacos了

SpringCloud Alibaba——2. Nacos服务注册_第16张图片

3.2 基于Nacos的服务消费者

注意:Nacos天生具备负载均衡,是因为其集成了ribbon

1)新建工程cloudalibaba-consumer-nacos-order83

2)修改pom



    
        cloud2020
        com.bjc.cloud
        1.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-consumer-nacos-order83

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        

        
        
            org.springframework.boot
            spring-boot-starter-test
        

        
            com.bjc.cloud
            cloud-api-commons
            ${project.version}
        
    

3)新建yml配置文件

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

## 消费者要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

4)启动类

package com.bjc.clous;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

5)配置类

因为Nacos集成了ribbon,所以需要支持RestTemplate,需要写一个配置类

package com.bjc.clous.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {
	@Bean
	@LoadBalanced
	public RestTemplate getRestTemplate(){
		return new RestTemplate();
	}
}

6)业务测试类

package com.bjc.clous.controller;

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

import javax.annotation.Resource;

@RestController
public class OrderNacosController {
	// public static final String SERVER_URL = "http://nacos-payment-provider";

	@Value("${service-url.nacos-user-service}")
	private String serverUrl;
	@Resource
	private RestTemplate restTemplate;

	@GetMapping("/consumer/payment/nacos/{id}")
	public String paymentInfo(@PathVariable("id") Long id){
		return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
	}
}

7)测试

启动83,查看Nacos,如图:

SpringCloud Alibaba——2. Nacos服务注册_第17张图片

访问83,如图:

SpringCloud Alibaba——2. Nacos服务注册_第18张图片

刷新,id值有变化,且是轮询的,所以nacos默认的负载均衡算法也是轮询。

3.3 服务注册中心对比

3.3.1 Nacos与其他注册中心特性对比表

  Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP + AP AP CP / CP
健康检查 TCP/HTTP/Mysql/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 不支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 不支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8s支持 支持 不支持 支持 支持 不支持

注意:Nacos支持AP与CP模式切换。

3.3.2 Nacos支持AP与CP模式切换

        C是所有节点在同一时间看到的数据是一致的,而A的定义是所有的请求都会收到响应

何时选择使用何种模式?  

        一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式,当前主流的服务如:SpringCLoud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

        如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则只用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

切换命令:curl -X PUT '$NACOS_SERVEr:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

你可能感兴趣的:(SpringCloud,Alibaba)