当前位置: 首页 > news >正文

容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql
2. 如何容器化部署nacos

为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址,所有的localhost都应该调整为你自己的服务器地址。
为不暴露我的服务器地址,本文全部使用localhost来代替服务器地址,所有的localhost都应该调整为你自己的服务器地址。

容器化nacos并实现服务发现

  • 本文使用技术:springclod、springcloudAlibaba、kotlin、jpa、gradle
创建项目
  • 创建empty project
    在这里插入图片描述

  • 选择jdk17、语言等级17

新建provider模块

  • 新建模块(命名为provider) 选择spring 3.0.2
  • 依赖添加spring data jpa、spring web、lombok
  • 添加mysql连接池依赖
dependencies {  
// other denpendenciesimplementation 'mysql:mysql-connector-java:8.0.26'  implementation("com.alibaba:druid:1.2.20")
// other denpendencies
}
  • mvn官网查询springcloud的导入方式,springcloud的github页面查询版本对应关系
  • mvn官网查询springcloudalibaba,引入springcloudalibaba对应版本
  • 引入spring-cloud-alibaba-nacos-discovery
ext {set('springCloudVersion', "2022.0.0")set('springCloudAlibabaVersion', "2022.0.0.0") // 设置Spring Cloud Alibaba的版本号
}repositories {//阿里源maven { url 'https://maven.aliyun.com/repository/public' }mavenCentral()
}dependencies {
...implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2022.0.0.0'
...
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" // 导入Spring Cloud Alibaba BOM}
}
  • 开放服务器8848、9848端口

  • 配置application(更改数据库地址和账户密码即可)

spring:cloud:nacos:discovery:# nacos注册中心地址server-addr: 127.0.0.1:8848username: nacospassword: nacos# 微服务名称application:name: depart-providerjpa:# 指定是否在spring容器启动时创建表,默认falsegenerate-ddl: trueshow-sql: truehibernate:# 指定应用重启时不重新更新表ddl-auto: none# 关闭前端访问的懒加载机制open-in-view: false# 配置数据源datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1/rdtcloud?serverTimezone=Asia/Shanghai&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falseusername: rootpassword: 'your_password'druid:# 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 日志
logging:# 控制台日志输出格式pattern:console: level-%level %msg%nlevel:# 控制springboot 启动时显示的日志级别root: info# hibernate相关的日志级别org.hibernate: info# 控制自己写的代码运行时显示的日志级别com.rdt: debug#  show-sql: true 的前提下显示sql中的动态参数值org.hibernate.type.descriptor.sql.BasicBinder: trace#  show-sql: true 的前提下显示sql的查询结果org.hibernate.type.descriptor.sql.BasicExtractor: traceserver:port: 8081servlet:encoding:charset: utf-8# 确保字符集总是被应用force: true

新建consumer模块

  • 新建模块(命名为provider) 选择spring 3.0.2
  • 依赖添加spring web、lombok
  • 引入provider0引入的微服务依赖内容(spring、springcloudalibaba、nacos-discovery)
ext {set('springCloudVersion', "2022.0.0")set('springCloudAlibabaVersion', "2022.0.0.0") // 设置Spring Cloud Alibaba的版本号
}repositories {//阿里源maven { url 'https://maven.aliyun.com/repository/public' }mavenCentral()
}dependencies {
...implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2022.0.0.0'
...
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" // 导入Spring Cloud Alibaba BOM}
}
  • 配置consumer的yml
spring:cloud:nacos:discovery:# nacos注册中心地址server-addr: 127.0.0.1:8848username: nacospassword: nacos# 微服务名称application:name: depart-consumer
  • 以上配置完成,启动provider和consumer,可以在注册中nacos中找到这两个服务
  • 如何容器化配置并启动nacos在文章开头的链接中
    在这里插入图片描述

consumer和provider通信

provider代码测试

使用传统的三层架构就可以

  • 实体类
package com.rdt.provider8081.beanimport com.fasterxml.jackson.annotation.JsonIgnoreProperties
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id@Entity
@JsonIgnoreProperties(value = ["hibernateLazyInitializer", "handler", "fieldHandler"])
class Depart {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)val id: Int? = nullvar name: String? = null}
  • 服务层
package com.rdt.provider8081.serviceimport com.rdt.provider8081.bean.Depart
import com.rdt.provider8081.repository.DepartRepository
import lombok.RequiredArgsConstructor
import org.springframework.stereotype.Service@Service
@RequiredArgsConstructor
class DepartService(private val departRepository: DepartRepository) {fun saveDepart(depart: Depart) = departRepository.save(depart)fun removeDepart(id: Int) {if (departRepository.existsById(id) != null)departRepository.deleteById(id)}fun getDepartById(id: Int): Depart {if (departRepository.existsById(id)) {return departRepository.getReferenceById(id)} else {return Depart()}}fun modifyDepart(depart: Depart): Depart {if (departRepository.existsById(depart.id!!)) {return departRepository.save(depart)}return Depart()}fun findAllDeparts() = departRepository.findAll()}
  • 持久层
package com.rdt.provider8081.repository  import com.rdt.provider8081.bean.Depart  
import org.springframework.data.jpa.repository.JpaRepository  interface DepartRepository :JpaRepository<Depart,Int>{  
}
  • 视图层
package com.rdt.provider8081.controllerimport com.rdt.provider8081.bean.Depart
import com.rdt.provider8081.service.DepartService
import lombok.RequiredArgsConstructor
import org.springframework.cloud.client.discovery.DiscoveryClient
import org.springframework.web.bind.annotation.*@RestController
@RequiredArgsConstructor
@RequestMapping("/provider/depart")
class DepartController(private val departService: DepartService, private val discoveryClient: DiscoveryClient
) {@PostMapping("/")fun saveHandle(@RequestBody depart: Depart) {println(depart.name)departService.saveDepart(depart)}@DeleteMapping("/{id}")fun deleteHandle(@PathVariable("id") id: Int) {return departService.removeDepart(id)}@PutMapping("/")fun updateHandle(@RequestBody depart: Depart) = departService@GetMapping("/get/{id}")fun getHandle(@PathVariable id: Int) = departService.getDepartById(id)@GetMapping("/list")fun listHandle() = departService.findAllDeparts()@GetMapping("/discovery")fun discoveryHandle(): List<String> {//获取所有的服务名称val services: List<String> = discoveryClient.servicesfor (service in services) {// 获取指定微服务名称的所有微服务实例var instances = discoveryClient.getInstances(service)for (instance in instances) {
//                val map = HashMap<String, Any>()val map = mutableMapOf<String, Any>()map["serviceName"] = servicemap["serviceId"] = instance.serviceIdmap["serviceHost"] = instance.hostmap["servicePort"] = instance.portmap["uri"] = instance.uriprintln(map)}}return services}}

Consumer代码测试

  • 注意,目前新版的springcloudAlibaba已经弃用了ribbon,所以负载均衡需要引入依赖
  • consumer不需要持久层,consumer是调用provider的,它不与数据库交互
dependencies{//nacos-discover引入implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer:4.0.4'
}
  • 实体层
package com.rdt.consumer8080.beanclass Depart {var id:Int?=nullvar name:String?=null
}
  • 配置类
  • consumer需要配置类,在视图层需要使用
package com.rdt.consumer8080.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  
class DepartConfig {  @LoadBalanced //以负载均衡的方式调用  
@Bean  
public fun restTemplate():RestTemplate{  
return RestTemplate()  
}  }
  • 视图层
package com.rdt.consumer8080.controllerimport com.google.gson.GsonBuilder
import com.rdt.consumer8080.bean.Depart
import com.rdt.consumer8080.consts.ConstTime
import lombok.RequiredArgsConstructor
import org.springframework.core.ParameterizedTypeReference
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.client.RestTemplate
import org.springframework.web.client.getForObject@RestController
@RequestMapping("/consumer/depart")
@RequiredArgsConstructor
class DepartController(private val template:RestTemplate) {//直连方式
//    final val SERVICE_PROVIDER_DEPART="http://localhost:8081/provider/depart/"//微服务方式final val SERVICE_PROVIDER_DEPART="http://depart-provider/provider/depart/"//增@PostMapping("/")fun saveHandle(@RequestBody depart:Depart):Boolean?{return template.postForObject(SERVICE_PROVIDER_DEPART, depart, Boolean::class.java)}//删@DeleteMapping("/del/{id}")fun deleteHandle(@PathVariable("id") id:Int){val url=SERVICE_PROVIDER_DEPART+"del"template.delete(url+id)}//改@PutMapping("/")public fun updateHandle(@RequestBody depart: Depart){template.put(SERVICE_PROVIDER_DEPART,depart)}//查单个@GetMapping("/get/{id}")fun getHandle(@PathVariable("id") id:Int):Depart?{val url:String= "$SERVICE_PROVIDER_DEPART/get/$id"return  template.getForObject(url,Depart::class.java)}//查全部@GetMapping("/list")fun listHandle():List<Depart>?{val url="$SERVICE_PROVIDER_DEPART/list"return template.getForObject(url,Array<Depart>::class.java)?.toList()}}

这些都完成之后就可以启动两个服务进行测试了。
有任何问题欢迎私信我,或者添加我的联系方式,我会很乐于交流!

相关文章:

容器化nacos部署并实现服务发现(gradle)

1.如何容器化部署mysql 2. 如何容器化部署nacos 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#xff0c;所有的localhost都应该调整为你自己的服务器地址。 为不暴露我的服务器地址&#xff0c;本文全部使用localhost来代替服务器地址&#x…...

金融行业如何数字化转型?_光点科技

金融行业的数字化转型涉及技术创新的引入、客户体验的改善、内部流程的优化、安全和合规性的加强以及员工技能和企业文化的转变。 技术创新 包括云计算、人工智能、大数据分析和区块链技术的采用。云计算增强数据处理的灵活性&#xff0c;AI和机器学习在风险评估和欺诈检测方面…...

【LeetCode刷题-滑动窗口】--1695.删除子数组的最大得分

1695.删除子数组的最大得分 注意&#xff1a;子数组为不同元素 方法&#xff1a;滑动窗口 使用变长滑动窗口寻找数组nums中的以每个下标作为结束下标的元素各不相同的最长子数组。用[start,end]表示滑动窗口&#xff0c;初始时startend0&#xff0c;将滑动窗口的右端点end向右…...

iOS OpenGL ES3.0入门实践

一、效果图 入门实践&#xff0c;做的东西比较简单&#xff0c;效果如下&#xff1a; 二、关于顶点坐标和纹理坐标 绘制图片需要设置顶点坐标和纹理坐标并加载像素数据&#xff0c;之所以要指定两组坐标是因为纹理和顶点使用不同的坐标系&#xff0c;就是告诉OpenGL&#xf…...

网络基础(一)

文章目录&#xff1a; 计算机网络认识计算机网络背景网络发展认识 “协议” 网络协议初识协议分层OSI七层模型TC/IP 五层&#xff08;或四层&#xff09;模型 网络传输基本流程网络传输流程图同局域网的两台主机进行通信跨网络的两台主机进行通信数据包的封装和分用 网络中的地…...

SQLServer添加Oracle链接服务器

又一次在项目中用到了在SQLServer添加Oracle链接服务器&#xff0c;发现之前文章写的也不太好使&#xff0c;那就再总结一次吧。 1、安装OracleClient 安装64位&#xff0c;多数SQLServer是64位&#xff0c;所以OracleClient也安装64位的&#xff1b; 再一个一般安装的Oracl…...

2017年计网408

第33题 假设 OSI 参考模型的应用层欲发送 400B 的数据 (无拆分), 除物理层和应用层之外, 其他各层在封装 PDU 时均引入 20 B 的额外开销, 则应用层数据传输效率约为( )A. 80%B. 83%C. 87%D. 91% 本题考察有关数据包逐层封装的相关概念。我们来一起分析一下。 这是要求大家必须…...

UE5中APlayerController属性与方法列表(翻译中......)

一、属性列表 类型 名称 描述 TObjectPtr< APa... AcknowledgedPawn 用于网络游戏&#xff0c;使客户端可以承认它拥有一个特定的卒。 TArray< FActive... ActiveForceFeedbackEffects TSharedPtr< str... ActiveHapticEffect_Gun TSharedPtr< str..…...

TCP连接保活机制

在TCP连接中有一个保活机制&#xff0c;叫做Keep-Alive&#xff0c;用语言描述就是如下&#xff1a; 在保活时间内&#xff0c;如果没有任何连接相关的活动&#xff0c;TCP 保活机制会开始作用&#xff0c;每隔一个时间间隔&#xff08;保活时间间隔&#xff09;&#xff0c;发…...

centos安装mysql8.0.20、tar包安装方式

基础环境centos7.5&#xff0c;mysql版本8.0.20&#xff0c;通过tar包安装&#xff0c;安装路径/usr/local。 mysql官网&#xff1a;https://dev.mysql.com/downloads/mysql/ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.x…...

k8s yaml文件含义

文章目录 1、YAML的文件格式和注意事项2、YAML各个字段含义 1、YAML的文件格式和注意事项 不支持制表符tab键缩进&#xff0c;需要使用空格缩进&#xff0c;使用缩进表示层级关系通常开头缩进2个空格&#xff0c;缩进的空格数不重要&#xff0c;只要相同层级的元素左对齐即可字…...

ProEasy机器人:运动+通讯相关说明

----------------机械手运动------- --常用指令&#xff1a;MovP弧线运动、MovL直线运动 MovP(1) --弧线轨迹运动到一号点 MovP(2) --弧线轨迹运动到二号点 MovL(1) --直线轨迹运动到一号点 MovL(2) --直线轨迹运…...

Visual Studio Code 配置 C/C++ 开发环境的最佳实践(VSCode + Clangd + CMake)

Visual Studio Code 配置 C/C 开发环境的最佳实践(VSCode Clangd CMake) 知乎原文参考地址1 与 VSCode 官方文档配置 相比拥有的优势 Clangd 具有更优秀的性能&#xff0c;微软官方 Cpptools 的代码提示功能有明显延迟Clangd 提供更精准的「转到定义」、「重命名符号」、「…...

年产200万件的超级工厂投产!巨头「闭环」汽车电子全产业链

随着汽车电动化程度的提升&#xff0c;汽车电子部件占整车成本比重逐步升高&#xff0c;已经从2012年的25%上升到2021年的55%。 且汽车电子电气架构向整车集中演进&#xff0c;智能汽车已经进入了软件及数据定义时代&#xff0c;底层硬件打破了过去几十年围绕特定应用不断增加…...

智能穿戴AR眼镜主板方案定制_MTK平台AR智能眼镜PCB板开发

AR智能眼镜&#xff0c;是采用了多种技术实现增强现实效果&#xff0c;是将虚拟信息和现实场景相结合的智能设备。 AR智能眼镜硬件上&#xff0c;包括多个传感器、显示装置和处理器等。其中&#xff0c;传感器用于捕捉用户的动作和环境信息&#xff0c;如摄像头、陀螺仪、加速…...

【入门Flink】- 11Flink实现动态TopN

基本处理函数&#xff08;ProcessFunction&#xff09; stream.process(new MyProcessFunction())方法需要传入一个 ProcessFunction 作为参数&#xff0c;ProcessFunction 不是接口 &#xff0c; 而是一个抽象类 &#xff0c;继承了AbstractRichFunction&#xff0c;所有的处…...

现在做跨境电商还需要全球代理IP吗?全球代理IP哪家靠谱?

随着全球互联网的发展&#xff0c;电商平台的发展和跨境贸易的便利化&#xff0c;跨境电商在过去几年中也一直呈现增长趋势&#xff0c;吸引了越来越多的企业和个体创业者入行。 然而&#xff0c;行业竞争也在不断加剧&#xff0c;跨境电商面临更多的越来越多的挑战&#xff0…...

微服务的常用组件

1、注册中心组件 Eureka、Nacos、Zookeeper、Consul 2、负载均衡组件 Ribbon 3、远程调用组件 OpenFeign 4、网关组件 Zuul、Gateway 5、服务保护组件 Hystrix、Sentinel 6、服务配置管理组件 SpringCloudConfig、Nacos、Apollo&#xff08;阿波罗&#xff09;配置中…...

Android问题笔记四十五:解决SeekBar操作thumb周围产生的圆形阴影/灰色阴影/白色圆圈的解决办法

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…...

AI从入门到精通,什么是LLMs大型语言模型?

大型语言模型是指由大量文本数据训练而成的自然语言处理模型&#xff0c;它可以生成高质量的文本内容&#xff0c;并能够理解和回答人类提出的问题。 这种模型通常基于深度学习技术&#xff0c;如循环神经网络&#xff08;RNN&#xff09;或变换器&#xff08;Transformer&…...

优测云测试平台 | 有效的单元测试(下)

接着上一篇内容&#xff0c;我们继续~ 四、测试的目标之三&#xff1a;快速反馈 测试的快速反馈有两个方面的含义: 1.测试运行要快速出结果。 2.当测试失败时&#xff0c;要能快速定位失败原因。 测试运行效率决定了开发的工作周期运转的快慢。在理想的 TDD 模型中&#x…...

CUDA安装

在cmd中输入nvidia-smi。显示CUDA Version&#xff1a;12.3&#xff0c;所以只能下载小于等于12.3的版本。如下图&#xff1a; 进这个网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 选择一个版本下载。 选择完后之后这样选择&#xff1a; 最后点击下载即…...

【XTDrone Ubuntu18.04】XTDrone + Ubuntu18.04 + PX4 安装过程

重新配置所有的软件 卸载之前安装的ROS GAZEBO 记得把/home下的.ros和.gazebo也删除&#xff0c;删就删干净 参考链接&#xff1a;ROS的卸载与安装 血泪总结&#xff01;亲测有效 卸载ROS方法 正式安装 安装依赖 sudo apt install ninja-build exiftool ninja-build protobuf…...

网站使用什么协议比较好

网站协议大多数使用HTTP和HTTPS HTTP协议&#xff0c;超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议。 HTTP是应用层协议&#xff0c;同其他应用层协议一样&#xff0c;是为了实现某一类具体应用的协议&…...

18. 机器学习——集成学习

机器学习面试题汇总与解析——集成学习 本章讲解知识点 什么是集成学习AdaBoost梯度提升树(Gradient Boosting Decision Tree, GBDT)随机森林(Random Forest,简称RF)XGBoostLightGBM本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器…...

SimaPro生命周期评估建模与碳足迹分析流程

SimaPro以系统和透明的方式轻松建模和分析复杂的生命周期&#xff0c;通过确定供应链中每个环节的热点&#xff0c;从原材料的提取到制造&#xff0c;分销&#xff0c;使用和处置&#xff0c;衡量所有生命周期阶段的产品和服务对环境的影响。SimaPro是过去25年评估生命周期的最…...

我的项目分享(不喜勿喷)

我要分享的项目是大喇叭C2C电商平台系统&#xff0c;一个面向移动端的电子商务平台&#xff0c;为个体消费者和商家提供直接交易和沟通的便利&#xff0c;丰富了人们的生活。 主要功能模块&#xff1a; 该项目的主要功能包括&#xff1a; 1. 用户注册功能&#xff1a;使用正则…...

PyTorch:张量与矩阵

PyTorch 是一个基于 Python 的科学计算包&#xff0c;专门针对深度学习研究&#xff0c;提供了丰富的工具和库。在 PyTorch 中&#xff0c;张量&#xff08;tensor&#xff09;是深度学习的核心数据结构&#xff0c;它可以看作是可以进行自动微分的多维数组。张量不仅可以代表标…...

传统广电媒体为何选择上云?有何优势?

随着现在互联网和科技的发展&#xff0c;现在更多的行业都搭上了科技这辆快车快速的完成了转型&#xff0c;那么在传统的广电媒资行业他们目前有哪些痛点呢&#xff1f;传统广电媒体转型发展现状是什么&#xff1f;企业如何数字化转型&#xff1f;企业上云的优势有哪些&#xf…...

系列十、堆参数调优

一、堆内存调优参数 -Xms堆空间的最小值&#xff0c;默认为物理内存的1/64-Xmx堆空间的最大值&#xff0c;默认为物理内存的1/4-XX:PrintGCDetails输出详细的GC处理日志 二、获取堆内存的默认物理内存 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 14:50* Description: 获…...