go 微服务 consul

news2024/12/25 22:41:51

服务发现

在微服务中每一个服务都有一个ip+端口,如果由客户端来之间进行连接会不方便,因此服务将自己的ip+端口提交给服务发现(常见的有consul,etcd,nacos),客户端通过服务发现来获取服务的ip+端口
在这里插入图片描述

consul

去下载:https://www.consul.io/downloads,下载后解压,并添加到环境变量

启动使用命令:

consul agent -dev

可以去浏览器访问:http://localhost:8500/

在这里插入图片描述

将grpc服务注册到consul

服务端:

package main

import (
	"context"
	"fmt"
	"github.com/hashicorp/consul/api"
	"google.golang.org/grpc"
	"grpc_consul/pb"
	"net"
)

type My struct {
	pb.UnimplementedHelloServer //必须嵌套这个
}

func (m *My) SayHello(c context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	var resp pb.HelloResponse
	resp.ResponseMsg = req.RequestName + " hello !!"
	return &resp, nil
}

func main() {
	/把grpc服务注册到consul上

	//1.初始化consul配置
	consulConfig := api.DefaultConfig()
	//设置consul服务器地址: 默认127.0.0.1:8500, 如果consul部署到其它服务器上,则填写其它服务器地址
	//consulConfig.Address = "127.0.0.1:8500"

	//2.创建consul对象
	consulClient, err := api.NewClient(consulConfig)
	if err != nil {
		fmt.Println("api.NewClient error")
		return
	}

	//3. 告诉consul,注册服务的配置信息
	agentService :=api.AgentServiceRegistration{
		ID:      "1",              // 服务id,顺序填写即可
		Tags:    []string{"test"}, // tag标签,别名
		Name:    "HelloService",   //服务名称, 注册到服务发现(consul)的K
		Port:    8801,             // 端口号: 需要与下面的监听, 指定 IP、port一致
		Address: "127.0.0.1",      // 当前微服务部署地址: 结合Port在consul设置为V: 需要与下面的监听, 指定 IP、port一致
		Check: &api.AgentServiceCheck{ //健康检测
			TCP:      "127.0.0.1:8801", //前微服务部署地址,端口 : 需要与下面的监听, 指定 IP、port一致
			Timeout:  "3s",             // 超时时间
			Interval: "15s",            // 循环检测间隔时间
		},
	}

	//4、注册服务到consul上
	consulClient.Agent().ServiceRegister(&agentService)

	/grpc远程服务调用
	//1 初始化一个gpc对象
	grpcServer := grpc.NewServer()
	//2 注册服务
	pb.RegisterHelloServer(grpcServer, &My{})

	//3 设置监听,指定IP
	listener, err := net.Listen("tcp", "127.0.0.1:8801")
	if err != nil {
		fmt.Println("net Listen error")
		return
	}
	defer listener.Close()

	//4 启动服务
	grpcServer.Serve(listener)
}

客户端:

package main

import (
	"context"
	"fmt"
	"github.com/hashicorp/consul/api"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"grpc_consul/pb"
	"log"
	"strconv"
)

func main() {
	//----------------------------consul相关---------------------------
	//初始化consul配置, 客户端服务器需要一致
	consulConfig := api.DefaultConfig()

	//2、获取consul操作对象
	consulClient, _ := api.NewClient(consulConfig)

	//3、获取consul服务发现地址,返回的ServiceEntry是一个结构体数组(服务集群)
	//参数说明:service:服务名称,服务端设置的那个Name, tag:标签,服务端设置的那个Tags,, passingOnly bool, q: 参数
	serviceEntry, _, _ := consulClient.Health().Service("HelloService", "test", false, nil)

	//打印地址
	fmt.Println(serviceEntry[0].Service.Address)
	fmt.Println(serviceEntry[0].Service.Port)

	//拼接从服务发现中获取的地址
	//strconv.Itoa: int转string型
	address := serviceEntry[0].Service.Address + ":" + strconv.Itoa(serviceEntry[0].Service.Port)

	//----------------------------hello微服务相关------------------------------

	//连接grpc服务(无加密)
	conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	//初始化grpc客户端
	grpcClient := pb.NewHelloClient(conn)
	resp, err := grpcClient.SayHello(context.Background(), &pb.HelloRequest{RequestName: "诗仙李白"})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(resp.ResponseMsg)
}

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

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

相关文章

Serialize对象二进制序列化与反序列化存储参数代替ini文件

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在C#中,可以使用System.Runtime.Serialization命名空间中的类来进行序列化操作。 以下是在C#中使用序列化的基本步骤: 创建一个可序列化的类,并标记该类和需要序列化的属性或字段…

deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类

系列文章目录(更新中) 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…

Maven解析

目录 Maven的概念 Pom 项目坐标 仓库 Maven环境搭建 安装jdk 配置maven 配置本地仓库地址 配置阿里云 maven 镜像仓库,下载速度更快 在idea中配置maven ​编辑 pom中名词解释 Maven命令 Maven的概念 Maven 是 Apache 软件基金会的一个开源项目,是一个…

PySide6学习笔记--基础环境的安装配置

PySide6介绍 QT官方发布Qt6.0之后,紧接着于2020年12月10日发布了PySide 6,对应C版的Qt6。从PySide6开始,PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下,不兼容Windows7系统&#xff0c…

QT 使用图表

目录 1、概念 1.1 坐标轴-QAbstractAxis 1.2 系列-QAbstractSeries 1.3 图例-Legend 1.4 图表-QChart 1.5 视图-QChartView 2、 QT 折线图 2.1 Qt 折线图介绍 2.2 Qt 折线图实现 Qt 图表是专门用来数据可视化的控件 Qt 图表包含折线、饼图、棒图、散点图、范围图等。…

英文翻译照片怎么做?掌握这个方法轻松翻译

在现代社会中,英文已经成为了一种全球性的语言,因此,我们在阅读文章或者查看图片时,经常会遇到英文的内容。为了更好地理解这些英文内容,我们需要将其翻译成中文。在本文中,我将探讨图片中英文内容翻译的方…

mysql通过binlog日志恢复误删数据

1、先查看binlog功能是否开启 show variables like %log_bin%;log_bin为ON说明可以使用binlog恢复,如果为OFF说明没有开启binlog。 2、删除部分数据做测试 3、查找binlog文件位置 show variables like %datadir%;cd /var/lib/mysqlls -l删除数据时间是在文件154与…

2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

文章目录 React:构建用户界面的首选Vue:简单优雅的前端框架Angular:Google支持的全面框架Node.js:服务器端的JavaScript运行环境比较不同框架的优势与劣势React:Vue:Angular:Node.js&#xff1a…

数字档案长期保存EEP文件管理和四性检测系统工具

数字(电子)档案EEP封装包工具软件(nhdeep),可以生成和导入长期保存标准格式的EEP封装文件,进行目录查看和条目信息查看,以及原文文件的查看。并提供对长期保存EEP封装文件的四性检测功,能保障封装文件质量。…

IP地址SSL证书

在许多企业用例中,公司需要SSL证书作为IP地址。公司使用IP地址通过Internet或Intranet访问各种类型的应用程序。根据组织策略,您希望使用SSL证书保护IP地址。 在本文中,我将向您解释获取IP地址SSL证书的过程,以及哪种类型的SSL证…

三菱PLC与变频器之间无线通讯

在工业现场由PLC远程控制变频器的应用非常常见,如果挖沟布线不便或者变频器在移动设备上,那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例,并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…

MySQL 运维篇+单机多实例多版本部署初始化缺少sys库概述

说明:本文讲述MySQL在单机多实例多版本部署情况下初始化后缺少sys库问题方案:初始化数据库前建议暂时将其他实例的Default options(/etc/my.cnf等)重命名结论:初始化新实例时即使指定相关参数也有可能会受到默认参数的…

浙江某半导体厂房配电室电气节点无线测温方案

摘 要:半导体被誉为“制造业的大脑”,在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位,是国民经济的重要支柱。 随着数字技术的发展和数字经济在国民经济中所占比重越来越高,半导体产业的重要性还会进一步提升。安…

chat聊天对话智能机器人Model大模型Platform大平台Data大数据支持

解决工作生活中遇到的任何问题,情感陪护,闲聊扯淡,无所不能。 图像描述生成(Image Caption)是一个融合计算机视觉、自然语言处理和机器学习的综合问题,它类似于翻译一幅图片为一段描述文字。该任务对于人类…

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)

乐观锁加注解Version后不需要手动进行加1操作。乐观锁是一种用于解决并发冲突的机制,在数据库中用于保护数据的一致性。Version注解是MyBatisPlus框架中的乐观锁注解,它会在更新数据时自动检查版本号是否一致,如果一致则进行更新操作&#xf…

混合App开发可以怎么玩?

随着越来越多的软件都是以saas或者云端的形式提供,因此,混合App的开发占比越来越大,大厂们纷纷都转向此类的开发。最近看到一些文章,混合App的开发,还能用计算机之父的那套理论--冯诺依曼结构来开开脑洞。 本篇文章&a…

多线程——学习笔记 1

目录 多线程的了解多线程并行和并发的区别Java程序运行原理多线程程序实现的方式1.继承Thread2.实现Runnable 多线程(实现Runnable的原理)实现多线程两种方式的区别匿名内部类实现线程的两种方式获取线程名字和设置名字获取当前线程的对象——hread.currentThread()…

allegro env 文件路径

很多人说在cadence安装路径里修改env文件不生效,或者在安装目录里找不到env文件路径。 原因可能是 用户环境变量中的HOME路径修改导致的,allegro会抓取HOME变量定义的路径中的env文件。所以你如果要修改env文件,最好看看HOME路径&#xff0c…

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个…

LTMC S/4HANA 2022 – 迁移您的数据

翻译一篇,估计很少人用过这个LTMC功能,更不用说,LTMOM了。一个还没开始用已经被弃用的事务代码: 在这篇博文中,我将解释如何在 S/4HANA 2022 版本中通过“迁移您的数据”应用程序逐步执行数据迁移。如您所知&#xff0…