容器化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()}}

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

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

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

相关文章

台式电脑的IP地址在哪里?解密台式电脑网络连接的秘密!

​ 如今智能手机和便携式笔记本电脑盛行的时代&#xff0c;台式电脑似乎逐渐被人们所忽视。然而&#xff0c;对于需要高性能和大容量存储的用户来说&#xff0c;台式电脑依然是最好的选择。而作为一款能够连接网络的设备&#xff0c;台式电脑也有自己独特的IP地址。下面虎观代理…

我自己理解的JAVA反射

1.定义 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制…

Python之函数进阶-匿名函数

Python之函数进阶-匿名函数 匿名函数 匿名:隐藏名字&#xff0c;即没有名称匿名函数:没有名字的函数。Lambda表达式 Python中&#xff0c;使用Lambda表达式构建匿名函数。 使用lambda关键字定义匿名函数&#xff0c;格式为 lambda [参数列表]: 表达式参数列表不需要小括号。无…

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…

每日一练 | 华为认证真题练习Day130

1、一台AR2200各由器需要恢复初始配置&#xff0c;则下面哪些描述是正确的&#xff1f;&#xff08;多选&#xff09; A. 重新指定下次启动加载的配置文件 B. 重置saved configuration C. 清除current configuration D. 重启该AR2200路由器 2、管理员想要彻底删除旧的设备配…

聊聊logback的isDebugEnabled

序 本文主要研究一下logback的isDebugEnabled isDebugEnabled public final class Loggerimplements org.slf4j.Logger, LocationAwareLogger, LoggingEventAware, AppenderAttachable<ILoggingEvent>, Serializable {//......public boolean isDebugEnabled() {retur…

突发!奥特曼宣布暂停ChatGPT Plus新用户注册!

大新闻&#xff01;就在刚刚&#xff01; OpenAI的CEO Sam Altman宣布暂停ChatGPT Plus 新用户注册&#xff01; Sam Altman对此解释道&#xff1a; 由于OpenAI开发日后ChatGPT使用量的激增超出了我们的承受能力&#xff0c;我们希望确保每个人都有良好的体验。 您仍然可以在a…

msvcp120.dll下载_msvcp120.dll文件丢失解决[dll系统文件修复]

msvcp120.dll是Microsoft Visual C库中的一个重要组件&#xff0c;属于Microsoft Visual C 2005 Redistributable Package。它提供了许多用于执行C程序所需的函数。Visual C是一款流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于游戏、视频和图形处理等领…

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

samba 共享目录write permission deny问题修复 可读取内容但不可修改 删除 新增文件

关于 update/delete/write permission deny问题修复 0.首先在服务器端执行testparm -s &#xff0c;测试 Samba 配置并显示结果。需确保服务器端参数 read only No &#xff0c;共享目录有写入权限 一、若配置了允许匿名访问&#xff0c;使用匿名访问来操作smb需要做如下处理…

【PyQt小知识 - 2】:QTextEdit内容的更新和获取、隐藏或显示滚动条、光标插入文本、文本自适应移动

文章目录 QTextEdit更新和获取内容隐藏或显示滚动条光标插入文本文本自适应移动 QTextEdit 更新和获取内容 更新&#xff1a;QTextEdit().setText(text) 或 QTextEdit().setPlainText(text) 获取&#xff1a;QTextEdit().toPlainText() setText()和setPlainText()的区别&…

Android10 状态栏蓝牙电量图标

Android10 源码状态栏蓝牙电量图标相关类 BatteryMeterDrawableBase&#xff1a;电量图标基类 BluetoothDeviceLayerDrawable&#xff1a; LayerDrawable 包含蓝牙设备图标和电池电量图标 BatteryMeterDrawable&#xff1a;内部类&#xff0c;继承自BatteryMeterDrawableBase B…

什么是线段树?

线段树 概述 线段树&#xff08;Segment Tree&#xff09;是一种二叉树数据结构&#xff0c;通常用于解决与区间或者段相关的问题。它主要用于处理一维区间的查询和更新操作&#xff0c;例如&#xff0c;查找区间内的最小值、最大值、和、平均值等。线段树是一种灵活而强大的…

大文件分片上传、断点续传、秒传

小文件上传 后端&#xff1a;SpringBootJDK17 前端&#xff1a;JavaScriptsparkmd5.min.js 一、依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</ve…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

LY/T 3134-2019 室内木质隔声门检测

室内木质隔声门是指能够满足一定隔声等级要求的室内木质门&#xff0c;根据隔声性能的不同&#xff0c;分为Ⅰ级室内木质隔声门。Ⅱ级室内木质隔声门、Ⅲ级室内木质隔声门、Ⅳ级木质隔声门。 LY/T 3134-2019 室内木质隔声门检测项目 测试项目 测试标准 外观 LY/T 1923 尺寸…

UE5 - UI Material Lab 学习笔记

1、学习资料收集 UI Material Lab : https://www.unrealengine.com/marketplace/zh-CN/product/ui-material-lab 视频1&#xff1a;https://www.bilibili.com/video/BV1Hm4y1t7Kn/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 视…

记录一次 添加脚本的记录+改错记录

1.Update 和 Delete 一定要记得where条件 update 表名称 set 字段1‘修改的值’ &#xff08;单引号&#xff09; where 字段‘’ and Aid‘’; update jxkh22 set JXKH2200001 ,JXKH2201002 where B003 and JXKH22034;delete from table_name where condition delete from …

Linux控制---进程程序替换

前言&#xff1a;前面我们学洗了Linux进程退出的相关知识&#xff0c;了解了什么是进程退出&#xff0c;已经进程等待的相关话题&#xff0c;今天&#xff0c;我们来学习Linux中的进程程序替换&#xff0c;进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…