【Java】Spring Boot 2 集成 nacos

news/2024/11/30 0:36:54/

【Java】Spring Boot 2 集成 nacos

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

项目地址:https://gitee.com/codingce/codingce-leetcode/tree/master/%E9%9D%A2%E7%BB%8F/Java/Nacos

pom

本次Spring Boot版本 2.2.6.RELEASE,nacos-config 版本 0.2.7,nacos-discovery版本 0.2.7
parent

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

dependencies

<!-- nacos-config-->
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.7</version>
</dependency>
<!-- nacos-discovery-->
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><version>0.2.7</version>
</dependency>

Nacos

Nacos版本 nacos-server-2.1.0

MySQL数据持久化 D:\dev\nacos-server-2.1.0\nacos\conf\application.properties 文件修改

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1234567890

创建数据库 nacos_config,导入数据 nacos-mysql.sql(配置文件文件夹下)

启动方式 ./startup.cmd -m standalone 单机方式.

登录地址 http://localhost:8848/nacos/#/login

默认账号密码 nacos nacos

实现配置的动态变更

注解方式

示例使用默认的空间

在这里插入图片描述

my.http_url=aaaaa
server.port=8092
.................
package cn.com.codingce.demo;import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@NacosPropertySource(dataId = "test", autoRefreshed = true)
@SpringBootApplication
public class CodingceDemoApplication {public static void main(String[] args) {SpringApplication.run(CodingceDemoApplication.class, args);}}

启动项目

2023-02-26 10:39:28.055  INFO 9544 --- [           main] c.a.b.n.c.u.NacosConfigPropertiesUtils   : nacosConfigProperties : NacosConfigProperties{serverAddr='127.0.0.1:8848', contextPath='null', encode='null', endpoint='null', namespace='null', accessKey='null', secretKey='null', ramRoleName='null', autoRefresh=false, dataId='null', dataIds='null', group='DEFAULT_GROUP', type=null, maxRetry='null', configLongPollTimeout='null', configRetryTime='null', enableRemoteSyncConfig=false, extConfig=[], bootstrap=Bootstrap{enable=false, logEnable=false}}

测试

package cn.com.codingce.demo.conrtoller;import cn.com.codingce.demo.utils.ResT;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class Test {/*** 通过NacosValue读取配置,* autoRefreshed 表示是否自动更新*/@NacosValue(value = "${my.http_url}", autoRefreshed = true)private String httpUrl;/*** 信息*/@RequestMapping(value = "/a", method = RequestMethod.GET)public ResT info() {return ResT.ok().put("nacos", httpUrl);}}

http://localhost:8092/test/a

在这里插入图片描述
在这里插入图片描述
测试可以实现动态的配置变更.

配置文件方式

采用自定义的命名空间进行测试,新建命名空间
在这里插入图片描述
在这里插入图片描述

新建test配置
在这里插入图片描述
这里我们已经创建完了,就截一张编辑图片.
在这里插入图片描述

配置文件 application.properties

# nacos
# nacos.config.bootstrap.enable 是否开启 Nacos 配置预加载功能.默认为 false, 这个配置必须设置, 否则不会读取 properties 配置文件
nacos.config.bootstrap.enable=true
# bootstrap.log-enable 是否开启 Nacos 支持日志级别的加载时机. 默认为 false.
nacos.config.bootstrap.log-enable=true
# server-addr 本机启动, 远端写远端的ip:端口
nacos.config.server-addr=127.0.0.1:8848
# nacos.config.type=properties 这个配置必须设置, 未设置会报空指针, 支持的类型 properties xml json text html yaml
nacos.config.type=properties
# Data Id
nacos.config.dataId=test
# 使用的 Nacos 的命名空间, 默认为 null.
nacos.config.namespace=7746f477-222d-4c88-8244-3fae3ae5bdfa
# Group
nacos.config.group=dev
# 自动刷新
nacos.config.auto-refresh=true

nacos.config.bootstrap.enable=true nacos.config.type=properties 这两个配置有点坑了,也怪自己不仔细,大家用的时候注意是否缺少这两个配置~

2023-02-26 10:57:13.579  INFO 7856 --- [           main] c.a.b.n.c.u.NacosConfigPropertiesUtils   : nacosConfigProperties : NacosConfigProperties{serverAddr='127.0.0.1:8848', contextPath='null', encode='null', endpoint='null', namespace='7746f477-222d-4c88-8244-3fae3ae5bdfa', accessKey='null', secretKey='null', ramRoleName='null', autoRefresh=true, dataId='test', dataIds='null', group='dev', type=PROPERTIES, maxRetry='null', configLongPollTimeout='null', configRetryTime='null', enableRemoteSyncConfig=false, extConfig=[], bootstrap=Bootstrap{enable=true, logEnable=true}}

在这里插入图片描述
在这里插入图片描述

测试可以实现动态的配置变更.

整合Nacos多环境

Data Id 方式

本次展示以 Data Id 方式实现多环境 dev、prod

项目配置文件

application.yml

spring:profiles:active: dev

application-dev.yml

spring:application:name: codingce-demo
nacos:config:auto-refresh: truebootstrap:enable: truelog-enable: truedata-ids: nacos-dev.propertiesgroup: devnamespace: 4f1d4fa1-7df7-47dd-8274-1e0cc53ebbb7server-addr: 127.0.0.1:8848type: properties# data-id:
management:endpoint:health:show-details: alwaysendpoints:web:exposure:include: '*'

application-prod.yml

spring:application:name: codingce-demo
nacos:config:auto-refresh: truebootstrap:enable: truelog-enable: truedata-ids: nacos-dev.propertiesgroup: devnamespace: 4f1d4fa1-7df7-47dd-8274-1e0cc53ebbb7server-addr: 127.0.0.1:8848type: properties# data-id:
management:endpoint:health:show-details: alwaysendpoints:web:exposure:include: '*'

实现服务的注册与发现

NacosRegisterConfiguration

配置文件

package cn.com.codingce.demo.config;import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;/*** @author 24607*/
@Configuration
public class NacosRegisterConfiguration {@Value("${server.port}")private int serverPort;@Value("${spring.application.name}")private String applicationName;@NacosInjectedprivate NamingService namingService;@PostConstructpublic void registerInstance() throws NacosException {namingService.registerInstance(applicationName, "127.0.0.1", serverPort, "DEFAULT");}
}

application-dev.yml

nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos

在这里插入图片描述

服务生产者

在这里插入图片描述
代码:

package cn.com.codingce.demo.conrtoller;import cn.com.codingce.demo.utils.ResT;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import static org.springframework.web.bind.annotation.RequestMethod.GET;@RestController
@RequestMapping("test")
public class Test {/*** 通过NacosValue读取配置,* autoRefreshed 表示是否自动更新*/@NacosValue(value = "${my.http_url}", autoRefreshed = true)private String httpUrl;/*** 信息*/@RequestMapping(value = "/a", method = GET)public ResT info() {return ResT.ok().put("nacos", httpUrl);}/*** name*/@RequestMapping(value = "/name", method = GET, produces = "application/json;charset=UTF-8")public String name() {return httpUrl;}}

服务消费者

在这里插入图片描述

代码

package cn.com.codingce.customer.controller;import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("test")
public class OrderController {private static final Logger logger = LoggerFactory.getLogger(OrderController.class);@NacosInjectedprivate NamingService namingService;private RestTemplate restTemplate = new RestTemplate();@RequestMapping(value = "/getOrder")public Map<String, Object> getOrder() {Map<String, Object> order = new HashMap<>();order.put("username", queryUserName());order.put("money", 100.00);return order;}private String queryUserName() {try {if (namingService != null) {// 选择 codingce-demo 服务的一个健康的实例(可配置负载均衡策略)Instance instance = namingService.selectOneHealthyInstance("codingce-demo");// 拼接请求接口url并请求选取的实例String url = "http://" + instance.getIp() + ":" + instance.getPort() + "/test/name";ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);return entity.getBody();}} catch (Exception e) {logger.error("query user error", e);}return null;}}

测试

在这里插入图片描述

如有问题欢迎讨论,踩了很多坑…


http://www.ppmy.cn/news/28322.html

相关文章

顿悟日记(一)

目录2023年1月顿悟日记&#xff1a;2023年2月24日顿悟日记&#xff1a;2023年2月25日顿悟日记&#xff1a;2023年2月26日顿悟日记&#xff1a;顿悟的经历是如此的奇妙&#xff0c;且让人亢奋的事情。 2023年1月顿悟日记&#xff1a; 1.我是面向对象还是面向过程&#xff1f; …

性能测试流程

性能测试实战一.资源指标分析1.判断CPU是否瓶颈的方法2.判断内存是否瓶颈的方法3.判断磁盘I/O是否瓶颈的方法4.判断网络带宽是否是瓶颈的方法二.系统指标分析三.性能调优四.性能测试案例1.项目背景2.实施规划&#xff08;1&#xff09;需求分析&#xff08;2&#xff09;测试方…

【java web篇】Maven的基本使用以及IDEA 配置Maven

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

一起Talk Android吧(第五百零七回:图片滤镜ImageFilterView)

文章目录背景介绍功能介绍图片滤镜图片圆角图片缩放图片旋转图片平移各位看官们大家好&#xff0c;上一回中咱们说的例子是"如何调整组件在约束布局中的角度",这一回中咱们说的例子是" 图片滤镜ImageFilterView"。闲话休提&#xff0c;言归正转&#xff0c…

ChatGPT是如何训练得到的?通俗讲解

首先声明喔&#xff0c;我是没有任何人工智能基础的小白&#xff0c;不会涉及算法和底层原理。 我依照我自己的简易理解&#xff0c;总结出了ChatGPT是怎么训练得到的&#xff0c;非计算机专业的同学也应该能看懂。看完后训练自己的min-ChatGPT应该没问题 希望大牛如果看到这…

Vue(6)

文章目录1. 自定义指令1.1 函数式1.2 对象式1.3 自定义指令常见坑1.4 创建全局指令2. 生命周期2.1 引出生命周期2.2 分析生命周期2.3 总结3. 组件3.1 认识组件3.2 使用组件 (非单文件组件)3.3 全局组件3.4 组件的几个注意点3.5 组件的嵌套3.6 VueComponent 构造函数3.7 一个重要…

LeetCode第334场周赛

2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…

【云原生】k8s中Pod进阶资源限制与探针

一、Pod 进阶 1、资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还…