• SpringCloud Nacos使用和配置,SpringCloud Nacos 服务注册中心配置使用


    SpringCloud Nacos使用和配置,SpringCloud Nacos 服务注册中心配置使用

    ================================

    ©Copyright 蕃薯耀 2021-03-26

    https://www.cnblogs.com/fanshuyao/

    一、SpringCloud Nacos概述
    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
    Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

    官方地址:

    https://nacos.io/zh-cn/index.html

    官方文档:

    https://nacos.io/zh-cn/docs/what-is-nacos.html

    Spring官方文档:

    https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html

    Nacos 的关键特性包括:
    1、服务发现和服务健康监测
    2、动态配置服务
    3、动态 DNS 服务
    4、服务及其元数据管理

    Nacos架构图

    二、SpringCloud nacos下载
    nacos全部版本下载地址

    https://github.com/alibaba/nacos/releases

    当前最新稳定版本是:nacos-server-1.4.1.zip,nacos-server-2.0.0-BETA.zip现在还是测试版本
    Windows下载地址:

    https://download.fastgit.org/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.zip

    Linux下载地址:

    https://download.fastgit.org/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz

    三、启动nacos

    解压nacos-server-1.4.1.zip,进行目录(D:soft acos-server-1.4.1 acosin),双击:startup.cmd 进行启动

    nacos启动报错:

    java.io.IOException: java.lang.IllegalArgumentException: db.num is null

    原因是:
    nacos默认是集群方式的,要配置mysql,利用Mysql共享配置信息

    解决方案:

    启动方式一(单机模式),建议使用这种方式:
    在bin路径(D:soft acos-server-1.4.1 acosin)打开cmd命令窗口,输入下面的命令启动:

    startup.cmd -m standalone

    关闭:
    打开cmd命令窗口,输入下面的命令:

    cmd shutdown.cmd

    或者双击shutdown.cmd关闭nacos。

    访问nacos管理后台,用浏览器打开下面的地址:

    http://127.0.0.1:8848/nacos

    登录名:nacos
    密码:nacos

    启动方式二(单机模式):
    复制一个startup.cmd(备份),用编辑器打开:startup.cmd,找到下面的命令:

    set MODE="cluster"

    修改成单机模式:

    set MODE="standalone"

    然后双击:startup.cmd重新启动,成功。

    这种方式,就是不用输额外的启动参数


    启动方式三(Mysql单机模式):需要创建数据库(仅支持Mysql,最好是5.7版本,5.5版本执行脚本文件时,默认时间会有问题)

    Nacos使用Mysql5.5版本问题:
    错误代码: 1067
    Invalid default value for 'gmt_create'

    Windows Mysql5.7安装和配置,Windows 安装多个Mysql,见:

    https://www.cnblogs.com/fanshuyao/p/14557184.html

    创建nacos数据库:
    数据库名:nacos
    字符集编码:utf8mb4
    排序规则:utf8mb4_general_ci

    创建表,执行nacos-mysql.sql文件的sql脚本
    脚本的位置在:

    D:soft
    acos-server-1.4.1
    acosconf
    acos-mysql.sql

    修改D:soft acos-server-1.4.1 acosconfapplication.properties配置文件:

    默认是:

    #spring.datasource.platform=mysql
    
    ### Count of DB:
    #db.num=1
    
    ### Connect URL of DB:
    #db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    #db.user.0=nacos
    #db.password.0=nacos

    修改后:

    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3307/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=root

    Nacos使用配置数据库的使用集群方式报错:

    nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net
    Caused by: java.net.UnknownHostException: jmenv.tbsite.net

    虽然配置了数据库,但还是不能以集群的方式启动,还是要在bin路径(D:soft acos-server-1.4.1 acosin)打开cmd命令窗口,输入下面的命令启动:

    startup.cmd -m standalone

    那为什么要使用Mysql数据呢?
    原因是:
    Nacos默认是使用了嵌入式数据库Derby,所以保存了用户相关的配置。但如果Nacos使用了集群,每个Nacos应用都有自己独立的Derby数据库,会造成数据库中配置的信息不一致。所以必须使用Mysql替换,保存配置信息完全一致。
    修改了数据库的连接配置,只是使用了Mysql数据库替换了Nacos自带的嵌入式数据库Derby,所有的配置都保存到了mysql数据库中。
    所以最终还是得以单机模式(standalone)启动。

    至于Nacos集群模式怎样安装启动?见:

    https://www.cnblogs.com/fanshuyao/p/14577977.html


    四、SpringCloud Nacos Provider服务提供者

    使用2个服务提供者,这样可以测试负载均衡:
    springCloud-8801-nacos-provider
    springCloud-8802-nacos-provider

    1、pom.xml引入依赖

    <properties>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <dependency>
                        <groupId>com.alibaba.cloud</groupId>
                        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                        <version>2.2.5.RELEASE</version>
                        <type>pom</type>
                        <scope>import</scope>
                </dependency>
        </dependencies>
    </dependencyManagement>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <!-- <version>2.2.4.RELEASE</version> -->
    </dependency>
     
     <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.4.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    2、application.properties配置文件修改

    server.port=8801
    
    spring.application.name=SPRING-CLOUD-NACOS-SERVICE
    
    #配置nacos服务地址,通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

    3、启动类

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * @EnableDiscoveryClient:通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
     *
     */
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringCloud8801NacosProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloud8801NacosProviderApplication.class, args);
        }
    
    }

    4、服务调用接口类

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.lqy.springCloud.Result;
    
    
    @RestController
    @RequestMapping("/nacos")
    public class ProviderController {
    
        @Value("${spring.application.name}")
        private String serviceName;
        
        @Value("${server.port}")
        private String serverPort;
        
        @RequestMapping(value="/test", produces = MediaType.APPLICATION_JSON_VALUE)
        public Result test() {
            return Result.ok(serverPort);
        }
        
        @RequestMapping(value="/get/{text}", produces = MediaType.APPLICATION_JSON_VALUE)
        public Result get(@PathVariable(value = "text") String text) {
            return Result.ok("端口=" + serverPort + ",text=" + text);
        }
        
        
    }

     

    五、SpringCloud Nacos Consumer服务消费者

    服务消费者只需要一个:
    springCloud-8805-nacos-web

    1、pom.xml引入依赖
    依赖和服务提供者一样。

    2、application.properties配置文件修改

    server.port=8805
    
    spring.application.name=SPRING-CLOUD-NACOS-CONSUMER
    
    #配置nacos服务地址,通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    #服务提供者的服务名,接口调用需要用到
    my.nacos.service.name=SPRING-CLOUD-NACOS-SERVICE

    3、启动类

    @EnableDiscoveryClient

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
     *
     */
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringCloud8805NacosWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloud8805NacosWebApplication.class, args);
        }
    
    }

    4、服务调用接口类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import com.lqy.springCloud.Result;
    
    @RestController
    @RequestMapping("/web")
    public class WebController {
    
        //消费者自己的服务名
        @Value("${spring.application.name}")
        private String serviceName;
        
        @Value("${server.port}")
        private String serverPort;
        
        //服务提供者的服务名
        @Value("${my.nacos.service.name}")
        private String myNacosServiceName;
        
        @Autowired
        private RestTemplate restTemplate;
        
        @RequestMapping(value="/test", produces = MediaType.APPLICATION_JSON_VALUE)
        public Result test() {
            return Result.ok(serverPort);
        }
        
        
        @RequestMapping(value="/get/{text}", produces = MediaType.APPLICATION_JSON_VALUE)
        public Result get(@PathVariable(value = "text", required = false) String text) {
            return restTemplate.getForObject("http://" + myNacosServiceName + "/nacos/get/" + text, Result.class);
        }
        
    }

    5、RestTemplate配置类

    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 RestConfig {
    
        //@LoadBalanced实现负载均衡,有多个服务提供者,一定要使用,不然会报错
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

     

    六、【消费者】调用【服务提供者】的接口测试

    Nacos整合了Ribbon,默认是轮询负载均衡算法

    http://127.0.0.1:8805/web/get/a

    返回结果:

    {
    "result": true,
    "timestamp": "2021-03-19 15:53:24",
    "msg": "操作成功。",
    "datas": "端口=8802,text=a"
    }

    (时间宝贵,分享不易,捐赠回馈,^_^)

    ================================

    ©Copyright 蕃薯耀 2021-03-26

    https://www.cnblogs.com/fanshuyao/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    字符串转义 保存到mysql
    vue项目引入背景图报Module not found: Error: Can't resolve './src/assets/img/bg2.jpg' in'xxx'错误
    vscode启动项目时报错:ERROR Failed to compile with 22 errors ,These relative modules were not found:
    整合阿里云视频播放器
    layer.open输入字数实时显示
    layer.prompt弹框
    解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
    微信扫码登录(OAuth2)
    阿里云短信服务
    单点登录(token,JWT)
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14577910.html
Copyright © 2020-2023  润新知