微服务05——consul

目录

服务发现

client、server工作流程:

服务发现的种类:

consul

consul和grpc

使用整体流程

目录结构

person.proto

 consul_server.go

consul_client.go

服务注销

consul_deregister.go

Github


服务发现

每个服务端把自己的ip和端口号注册到服务发现模块

客户端访问服务的时候去服务发现模块查找IP:PORT,然后访问相应的服务

[服务发现,也可以看做一个服务,是为服务提供服务的]

 图片来源:

https://www.bilibili.com/video/BV1po4y1X7hH?p=85

健康检查:

服务发现模块定期查看服务端能不能访问

client、server工作流程:

  1. 每个server启动时,都将自己的IP、port 和 服务名 注册给 ”服务发现“
  2. 当 client 向服务发现发起服务请求时, “服务发现” 会自动找一个可用的 服务,将其 IP/port/服务名返回给 client
  3. client 再借助服务发现,访问 server。

服务发现的种类:

  • consul: 常应用于 go-micro 中。
  • mdns:go-micro中默认自带的服务发现。
  • etcd:k8s 内嵌的服务发现
  • zookeeper:java中较常用。

consul

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。

特性:

  • 服务发现: consul 提供服务, 服务端 主动向 consul 发起注册。
  • 健康检查: 定时发送消息,类似于 “心跳包”,保证 客户端获得到的 一定是 健康的服务。
  • 键值存储: consul 提供,但是我们使用 redis
  • 多数据中心:可以轻松搭建集群。

安装 consul 源码包:

$ go get -u -v github.com/hashicorp/consul

启动命令

consul agent -dev

consul和grpc

使用整体流程

  1. 创建 proto文件 , 指定 rpc 服务

  2. 启动 consul 服务发现 consul agent -dev

  3. 启动server

    1. 获取consul 对象。

    2. 使用 consul对象,将 server 信息,注册给 consul

    3. 启动服务

  4. 启动client

    1. 获取consul 对象。

    2. 使用consul对象,从consul 上获取健康的 服务。

    3. 再访问服务 (grpc远程调用)

目录结构

person.proto

syntax = "proto3";

package pb;

option go_package ="../pb";// 避免错误 unable to determine Go import path for "myproto.proto"

message Person{
  string name = 1;
  int32 age = 2;
}

// 添加rpc服务
service hello{
  rpc sayHello (Person) returns (Person);
}

编译命令

protoc --go_out=plugins=grpc:./ *.proto

 consul_server.go

package main

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

// 定义类
type Children struct {
}

// 绑定类方法, 实现接口
func (this *Children) SayHello(ctx context.Context, p *pb.Person) (*pb.Person, error) {
	p.Name = "你好" + p.Name
	return p, nil
}

func main() {

	// 把 grpc服务注册到consul上

	// 1. 初始化consul配置

	consulConfig := api.DefaultConfig()

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

	// 3. 告诉consul即将注册的服务配置信息
	registerService := api.AgentServiceRegistration{
		ID:      "id_1",
		Tags:    []string{"grpc", "consul"}, // 服务别名
		Name:    "grpc and consul",     // 当前服务名字
		Address: "127.0.0.1",
		Port:    8800,
		Check: &api.AgentServiceCheck{
			CheckID:"consul grpc test",
			TCP: "127.0.0.1:8800",
			Timeout:"1s",
			Interval: "5s",
		},
	}

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


	// grpc 远程调用

	// 1. 初始化 grpc 对象,
	grpcServer := grpc.NewServer()

	// 2.注册服务
	pb.RegisterHelloServer(grpcServer, new(Children))

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

	// 4.启动服务
	fmt.Println("服务启动...")
	grpcServer.Serve(listener)

}

consul_client.go

package main

import (
	"awesomeProject1/Microservices/consul/pb"
	"context"
	"fmt"
	"github.com/hashicorp/consul/api"
	"google.golang.org/grpc"
	"strconv"
)

func main(){

	// 1. 初始化 consul 配置
	consulConfig := api.DefaultConfig()

	// 2. 创建 consul对象  --(可以重新指定consul属性,ip,port,...,也可以使用默认)
	consulClient, err := api.NewClient(consulConfig)

	// 3. 服务发现, 从consul上获取健康的服务
	services, _, err := consulClient.Health().Service("grpc and consul", "grpc", true, nil )

	// 这里可以添加简单的负载均衡,访问压力均摊给集群中的每个服务

	addr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port)

	// grpc 远程调用

	// 1. 连接服务
	// 原始的方式
	// grpcConn, _ := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure())
	// 使用服务发现consul上的 ip和port 来与服务建立连接
	grpcConn, _ := grpc.Dial(addr, grpc.WithInsecure())

	// 2. 初始化一个grpc客户端
	grpcClient := pb.NewHelloClient(grpcConn)

	var person pb.Person
	person.Name = "张三"
	person.Age = 18

	// 3. 调用远程函数
	p, err := grpcClient.SayHello(context.TODO(), &person)
	fmt.Println(p, err)
}

结果

 

 

 

服务注销

consul_deregister.go

package main

import "github.com/hashicorp/consul/api"

func main(){
	// 1. 初始化一个consul配置
	consulConfig := api.DefaultConfig()

	// 2. 创建consul对象
	consulClient, _ := api.NewClient(consulConfig)

	// 3. 注销服务
	consulClient.Agent().ServiceDeregister("id_1")
}


Github

PractiseGo/Microservices/consul at master · YTIANYE/PractiseGo · GitHubicon-default.png?t=LA92https://github.com/YTIANYE/PractiseGo/tree/master/Microservices/consul

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值