Nacos使用(下):SpringBoot和SpringCloud项目中使用Nacos

news2024/11/27 0:17:41

Nacos使用(上):Nacos安装
Nacos使用(中):Java项目和Spring项目使用Nacos
Nacos使用(下):SpringBoot和SpringCloud项目中使用Nacos

3.3 SpringBoot SDK

父工程指定springboot版本:

<dependencyManagement>
  <dependencies>
	<dependency>
  	  <groupId>org.springframework.boot</groupId>
  	  <artifactId>spring-boot-dependencies</artifactId>
  	  <version>2.4.2</version>
  	  <type>pom</type>
  	  <scope>import</scope>
	</dependency>
  </dependencies>
</dependencyManagement>

导入jar包

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--配置中心-->
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>nacos-config-spring-boot-starter</artifactId>
  <version>0.2.12</version>
</dependency>
<!--服务治理-->
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>nacos-discovery-spring-boot-starter</artifactId>
  <version>0.2.12</version>
</dependency>

配置文件application.properties

spring.application.name=boot-test
server.port=8080
#配置中心
nacos.config.server-addr=127.0.0.1:8848
nacos.config.username=nacos
nacos.config.password=nacos
nacos.config.namespace=dev
#注册中心
nacos.discovery.server-addr=127.0.0.1:8848
nacos.discovery.username=nacos
nacos.discovery.password=nacos
nacos.discovery.namespace=dev

启动类

package com.test.nacos;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.spring.context.annotation.EnableNacos;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

/**
 * @author 专治八阿哥的孟老师
 */
@SpringBootApplication
// 读取配置中心配置文件
@NacosPropertySource(dataId = "example.properties", autoRefreshed = true)
// 启动服务治理
@EnableNacosDiscovery
public class BootTestStarter {
    public static void main(String[] args) {
        SpringApplication.run(BootTestStarter.class, args);
    }
}

Nacos上创建一个配置文件

在这里插入图片描述

属性可以直接通过@NacosValue读取,也可以映射到一个配置类中

配置类:

package com.test.nacos;

import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author 专治八阿哥的孟老师
 */
@Component
@NacosConfigurationProperties(prefix = "test", dataId = "example.properties", autoRefreshed = true)
public class TestConfiguration {
    private String config;

    public String getConfig() {
        return config;
    }

    public void setConfig(String config) {
        this.config = config;
    }
}

测试类

package com.test.nacos;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;

/**
 * @author 专治八阿哥的孟老师
 */
@Component
public class TestBean {

    @NacosInjected
    private ConfigService configService;
    // 服务名称
    @Value("${spring.application.name}")
    private String applicationName;
    // 服务的端口号
    @Value("${server.port}")
    private Integer port;
    // 远程配置,直接读取属性
    @NacosValue(value = "${test.config}", autoRefreshed = true)
    private String config;
    @Autowired
    private TestConfiguration testConfiguration;

    @NacosInjected
    private NamingService namingService;

    @PostConstruct
    public void register() throws NacosException {
        // 测试服务注册
        namingService.registerInstance(applicationName, "127.0.0.1", port);
    }

    @PostConstruct
    public void init() {
        try {
            System.out.println(configService.getConfig("example.properties", "DEFAULT_GROUP", 5000));
            System.out.println(config);
            System.out.println(testConfiguration.getConfig());
        } catch (NacosException e) {
            throw new RuntimeException(e);
        }
    }
}

3.4 SpringCloud

父工程指定:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2020.0.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.4.2</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2021.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

3.4.1 配置中心

在 Nacos Spring Cloud 中,dataId 的完整格式如下,其中**${prefix}**默认是spring.application.name,可以通过配置

${prefix}-${spring.profiles.active}.${file-extension}

Nacos Spring Cloud默认使用的是bootstrap.properties文件

spring.application.name=consumer

spring.profiles.active = dev

不同环境使用不同配置文件,bootstrap-dev.properties内容为如下

server.port=8080

spring.cloud.nacos.config.server-addr=http://localhost:8848
spring.cloud.nacos.config.namespace=${spring.profiles.active}
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos

在Nacos上添加配置文件,文件的dataId要与当前项目的application-name对应

在这里插入图片描述

spring.datasource.url = jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username =root
spring.datasource.password =
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver

测试类

package com.test.consumer;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 专治八阿哥的孟老师
 */
@RestController
@RefreshScope // 自动刷新
public class TestController {
    //从nacos读取
    @Value("${spring.datasource.url}")
    private String url;

    @RequestMapping("test")
    public String test() { //访问接口可以看读取出的配置
        return url;
    }
}

启动类

package com.test.consumer;

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

/**
 * @author 专治八阿哥的孟老师
 */
@SpringBootApplication
public class ConsumerStarter {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerStarter.class, args);
    }
}

3.4.2 服务治理-Feign

常用的服务有Feign和Dubbo两种,我们写两种类型的提供者,注意此处配置与版本有关,旧版本需要在启动类上加@EnableDiscoveryClient

http服务的提供者不需要特殊配置,写一个普通的controller接口

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

启动类

package com.test.nacos;

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

/**
 * @author 专治八阿哥的孟老师
 */
@SpringBootApplication
public class HttpProviderStarter {
    public static void main(String[] args) {
        SpringApplication.run(HttpProviderStarter.class, args);
    }
}
package com.test.nacos.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 专治八阿哥的孟老师
 */
@RestController
public class TestController {

    @RequestMapping("/test")
    public Map test() {
        Map map = new HashMap();
        map.put("name", "张三");
        map.put("id", 123);
        return map;
    }
}

bootstrap.properties

spring.application.name=provider-http
spring.profiles.active = dev

server.port=8081

spring.cloud.nacos.discovery.server-addr=http://localhost:8848
spring.cloud.nacos.discovery.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

消费者

<!--服务治理-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--调用feign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

bootstrap.properties

spring.cloud.nacos.discovery.server-addr=http://localhost:8848
spring.cloud.nacos.discovery.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

#只做消费者,不被其他服务发现
spring.cloud.nacos.discovery.register-enabled=false

启动类上添加@EnableFeignClients注解

在这里插入图片描述

调用Feign服务,详见SpringCloud

package com.test.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.Map;

/**
 * @author 专治八阿哥的孟老师
 */
@FeignClient(value = "provider-http")
public interface TestFeignService {
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    Map test();
}

需要用到服务的地方注入service即可

@Autowired
private TestFeignService testFeignService;

@RequestMapping("feign")
public Map feign() {
    return testFeignService.test();
}

3.4.3 服务治理-Dubbo

Dubbo服务通常需要把暴露的接口和实体单独提取出来,封装成jar,服务提供者实现jar里的接口,消费者通过jar调用远程服务

在这里插入图片描述

dubbo-service,注意实体类一定要实现Serializable接口,否则调用过程中会报通信失败

package com.test.nacos.entity;

import java.io.Serializable;

/**
 * @author 专治八阿哥的孟老师
 */
public class User implements Serializable {
    private Integer id;
    private String name;

   //getter/setter略
}
package com.test.nacos.service;

import com.test.nacos.entity.User;

public interface TestDubboService {

    User getUser(Integer id);
}

dubbo-provider

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
  </dependency>
  <!--不同版本不一样-->
  <dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
  </dependency>
  <!--定义接口的包-->
  <dependency>
    <groupId>com.test.nacos</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>
  </dependency>
</dependencies>

bootstrap.properties

spring.application.name=provider-dubbo
spring.profiles.active = dev

server.port=8082

spring.cloud.nacos.discovery.server-addr=http://localhost:8848
spring.cloud.nacos.discovery.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

dubbo.application.name=${spring.application.name}
# dubbo扫描包路径
dubbo.scan.base-packages=com.test.nacos.service
# dubbo协议
dubbo.protocol.name=dubbo
# 随机端口
dubbo.protocol.port=-1
# nacos地址
dubbo.registry.address=spring-cloud://localhost:8848
dubbo.registry.username=nacos
dubbo.registry.password=nacos

接口实现类

package com.test.nacos.service.impl;

import com.test.nacos.entity.User;
import com.test.nacos.service.TestDubboService;
import org.apache.dubbo.config.annotation.DubboService;

/**
 * @author 专治八阿哥的孟老师
 */
@DubboService // dubbo注解
public class TestDubboServiceImpl implements TestDubboService {
    @Override
    public User getUser(Integer id) {
        User user = new User();
        user.setId(id);
        user.setName("test");
        return user;
    }
}

启动类

package com.test.nacos;

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

/**
 * @author 专治八阿哥的孟老师
 */
@SpringBootApplication
public class DubboTestStarter {
    public static void main(String[] args) {
        SpringApplication.run(DubboTestStarter.class, args);
    }
}

消费者追加jar包

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
  <groupId>javax.ws.rs</groupId>
  <artifactId>jsr311-api</artifactId>
  <version>1.1.1</version>
</dependency>
<dependency>
  <groupId>com.test.nacos</groupId>
  <artifactId>dubbo-service</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
dubbo.registry.protocol=dubbo
dubbo.registry.address=spring-cloud://localhost:8848
# dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
dubbo.cloud.subscribed-services=provider-dubbo

需要引入的时候,通过 @DubboReference引入服务

    @DubboReference
    private TestDubboService testDubboService;

    @RequestMapping("dubbo")
    public User dubbo() {
        return testDubboService.getUser(1);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI:05 - 基于深度学习的道路交通信号灯的检测与识别

随着人工智能的快速发展,基于深度学习的视觉算法在道路交通领域中起到了重要作用。本文将探讨如何利用深度学习技术实现道路交通信号灯的检测与识别,通过多处代码实例展示技术深度。 道路交通信号灯是指示交通参与者行驶和停止的重要信号。准确地检测和识别交通信号灯对于智…

【MySQL】JDBC

目录 1.JDBC 2.Java代码操作MySQL 2.1前置条件 2.2常用操作 2.2.1插入 2.2.2删除 2.2.3查询 1.JDBC 概念&#xff1a;JDBC&#xff0c;即Java Database Connectivity( java数据库连接 )。是一种用于执行SQL语句的Java API&#xff0c;它是Java中的数据库连接规范。这个A…

2611B数字源表

Keithley 2611B源表使精密DC、脉冲和低频交流源测量测试比以前更快、更容易、更经济。吉时利2611B的I-V功能测试速度是竞争产品的2到4倍&#xff0c;它结合了: 吉时利的高速第三代源测量单元(SMU)设计嵌入式测试脚本处理器(TSP)TSP-Link&#xff0c;一种快速触发和单元间通信总…

1775_树莓派3B键盘映射错误解决

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间&#xff0c;最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说&#xff0c;我完全没有找到当初在我的笔记本上使…

java基础-----第三篇

系列文章目录 文章目录 系列文章目录前言一、final二、String、StringBuffer、StringBuilder前言 一、final 最终的 修饰类:表示类不可被继承 修饰方法:表示方法不可被子类覆盖,但是可以重载 修饰变量:表示变量一旦被赋值就不可以更改它的值。 (1)修饰成员变量 如果fina…

【Go 基础篇】Go语言结构体实例的创建详解

在Go语言中&#xff0c;结构体是一种强大的数据类型&#xff0c;允许我们定义自己的复杂数据结构。通过结构体&#xff0c;我们可以将不同类型的数据字段组合成一个单一的实例&#xff0c;从而更好地组织和管理数据。然而&#xff0c;在创建结构体实例时&#xff0c;有一些注意…

用深度强化学习来玩Flappy Bird

目录 演示视频 核心代码 演示视频 用深度强化学习来玩Flappy Bird 核心代码 import torch.nn as nnclass DeepQNetwork(nn.Module):def __init__(self):super(DeepQNetwork, self).__init__()self.conv1 nn.Sequential(nn.Conv2d(4, 32, kernel_size8, stride4), nn.ReLU(inp…

java八股文面试[数据库]——MySql聚簇索引和非聚簇索引区别

聚集索引和非聚集索引 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。 1、聚集索引 聚集索引表记录的排列顺序和索引的排列顺序一致&#xff08;以InnoDB聚集索引的主键索引来说&#xff0c;叶子节点中存储的就是行数据&#xff0c;行数据在…

【Go 基础篇】Go语言结构体之间的转换与映射

在Go语言中&#xff0c;结构体是一种强大的数据类型&#xff0c;用于定义和组织不同类型的数据字段。当我们处理复杂的数据逻辑时&#xff0c;常常需要在不同的结构体之间进行转换和映射&#xff0c;以便实现数据的转移和处理。本文将深入探讨Go语言中结构体之间的转换和映射技…

Folx 5适用Mac的BT客户端下载器

Mac 上免费的网络下载管理器Folx Mac 下载器有一个支持 Retina 显示的现代界面。提供独特的系统排序、存储下载内容与预览下载文件。Folx 是具有真正 Mac 风格界面的 macOS 免费下载管理器。它提供了方便的下载管理,灵活的设置等。Folx 专业版是 Mac 上一个出色的种子下载器&am…

Solidity 小白教程:4. 函数输出 return

Solidity 小白教程&#xff1a;4. 函数输出 return 这一讲&#xff0c;我们将介绍Solidity函数输出&#xff0c;包括&#xff1a;返回多种变量&#xff0c;命名式返回&#xff0c;以及利用解构式赋值读取全部和部分返回值。 返回值 return 和 returns Solidity有两个关键字与…

1773_把vim的tab键设置为4个空格显示

全部学习汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 有时候自己觉得自己很奇怪&#xff0c;看着Linux的命令窗口就觉得很顺眼。那些花花绿绿的字符以及繁多的方便命令工具&#xff0c;确实是比Windows强不少。不过&a…

电脑前置耳机没声音怎么办

有很多小伙伴反映在将自己的耳机连接到主机前面时没有声音&#xff0c;这是怎么回事呢&#xff0c;遇到这种情况应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下电脑前置耳机没声音的解决方法&#xff0c;有需要的小伙伴可以来看一看电脑前面耳机没声音。 解决方法&a…

SpringCloud(十)——ElasticSearch简单了解(三)数据聚合和自动补全

文章目录 1. 数据聚合1.1 聚合介绍1.2 Bucket 聚合1.3 Metrics 聚合1.4 使用 RestClient 进行聚合 2. 自动补全2.1 安装补全包2.2 自定义分词器2.3 自动补全查询2.4 拼音自动补全查询2.5 RestClient 实现自动补全2.5.1 建立索引2.5.2 修改数据定义2.5.3 补全查询2.5.4 解析结果…

Web安全——信息收集上篇

Web安全 一、信息收集简介二、信息收集的分类三、常见的方法四、在线whois查询在线网站备案查询 五、查询绿盟的whois信息六、收集子域名1、子域名作用2、常用方式3、域名的类型3.1 A (Address) 记录&#xff1a;3.2 别名(CNAME)记录&#xff1a;3.3 如何检测CNAME记录&#xf…

yolov5自定义模型训练二

前期准备好了用于训练识别是否有火灾的数据集后就可以开始修改yolo相关文件来进行训练 数据集放到yolov5目录里 在data目录下新建yaml文件设置数据集信息如下 在model文件夹下新增新的model文件 开始训练 训练出错 确认后是对训练数据集文件夹里的文件名字有要求&#xff0c;原…

YOLO目标检测——人脸数据集下载分享

目标检测人脸数据集在人脸识别、监控和安防、社交媒体、情感分析、医疗诊断等多个领域都具有广泛的应用潜力。 数据集点击下载&#xff1a;YOLO人脸数据集7000图片.rar

Shell 脚本入门

目录 一、Shell是什么 1.1 我们为什么要学习Shell和使用Shell&#xff1f; 1.2 Shell的分类有哪些&#xff1f; 二、Shell脚本入门知识 2.1 Shell文件命名规范 2.2 Shell解析器 2.3 用Shell 编写hello World 三、Shell的四种变量类型 3.1 系统预定义变量 3.2 自定义变…

移动端几种适配方式

移动端几种适配方式 第一种&#xff1a;rem <meta name"viewport" content"widthdevice-width, initial-scale1.0,,maximum-scale1,user-scalableno">设置窗口不能缩放 一般设备宽度的十分之一 如果这个值是动态计算的需要使用js去设置 根据设备…

【rar密码】使用WinRAR加密的三种方法

如何使用WinRAR加密压缩包&#xff1f;详细介绍WinRAR中的三种加密方法给大家。 方法一&#xff1a;加密 最简单的加密方法&#xff0c;就是在加密文件时输入想要设置的密码&#xff0c;完成加密和压缩了。 方法二&#xff1a;自动加密 普通的加密方式&#xff0c;需要我们加…