GO微服务中http请求的流程

当客户端向服务端发送一个http请求时,请求是如何在基于微服务架构的程序中传输的,下面简单解释一下。

首先假设我们有一个User微服务,它的注册代码如下,这里假设etcd注册中心的ip和端口是"127.0.0.1:2379",User微服务监听的ip和端口是"127.0.0.1:8082",现在已经把User微服务注册到etcd

	// etcd注册件
	etcdReg := etcd.NewRegistry(
		registry.Addrs("127.0.0.1:2379"),
	)
	// 得到一个微服务实例
	microService := micro.NewService(
		micro.Name("rpcUserService"), // 微服务名字
		micro.Address("127.0.0.1:8082"),
		micro.Registry(etcdReg), // etcd注册件
		micro.Metadata(map[string]string{"protocol": "http"}),
	)

同理假设其他一些微服务也是通过这个方式把服务注册到etcd

然后到gateway网关微服务,它监听的ip和端口是"127.0.0.1:4000",并且在本地创建了User微服务实例,那么它就可以在本地调用User微服务,而无需再通过网络请求访问User微服务

    etcdReg := etcd.NewRegistry(
		registry.Addrs("127.0.0.1:2379"),
	)
    // 用户
	userMicroService := micro.NewService(
		micro.Name("userService.client"),
		micro.WrapClient(wrappers.NewUserWrapper),
	)
	// 用户服务调用实例
	userService := user.NewUserService("rpcUserService", userMicroService.Client())
    serviceMap := make(map[string]interface{})
	serviceMap["userService"] = userService
    //创建微服务实例,使用gin暴露http接口并注册到etcd
	server := web.NewService(
		web.Name("httpService"),
		web.Address("127.0.0.1:4000"),
		//将服务调用实例使用gin处理
		web.Handler(weblib.NewRouter(serviceMap)),
		web.Registry(etcdReg),
		web.RegisterTTL(time.Second*300),
		web.RegisterInterval(time.Second*150),
		web.Metadata(map[string]string{"protocol": "http"}),
	)

那么首先它的工作流程是这样的:

1. http请求到达gateway网关微服务"127.0.0.1:4000" 

2.gateway微服务接收到请求,根据路由规则分发请求到相应的处理程序 

3. 如果请求需要调用 user 微服务,gateway 会通过注册中心"127.0.0.1:2379"获取 user 微服务的地址"127.0.0.1:8082",然后建立连接并发送请求

如果在gateway微服务中创建了User微服务的实例,那么就可以直接在gateway微服务直接调用User微服务的方法,不需要再进行网络通信,创建微服务实例是为了在代码层面方便地调用、封装业务逻辑和实现模块化,使整个系统更加灵活、可维护和可扩展,那这段代码中关于微服务客户端实例的创建与etcd是怎么关联起来的呢?

这里使用的是 micro.NewService() 函数创建了微服务实例,它是 go-micro 框架中的一个功能,会封装与注册中心(etcd)的交互,使得你在创建微服务实例时不需要显式地指定 IP 和端口。这是因为在 micro.NewService() 中,你通过 micro.Registry(etcdReg) 指定了注册中心(etcd),并且在框架内部,它会处理与 etcd 的通信以获取微服务的位置信息(IP 和端口)。因此,你在创建微服务实例时不需要手动查询 etcd。

当你使用 micro.NewService() 创建微服务实例后,你可以通过 userMicroService.Client() 这样的方式来创建客户端实例,用于调用其他微服务。在这里,userMicroService 实例已经被设置了注册中心和其他必要的配置,因此它可以正确地创建客户端实例并进行通信。

总之,上述代码利用 go-micro 框架提供的封装,使得创建微服务实例和客户端实例的过程变得更加简化,而无需直接涉及与 etcd 的交互和手动查询 IP 和端口。

etcd还为其他微服务之间的通信建立连接,微服务的注册发现机制的主要目的是为了让不同的微服务能够发现彼此的位置和可用性,以便在整个分布式系统中进行通信和协作。

虽然你在网关微服务中创建了其他微服务的实例,但这些实例只是本地对象,用于在网关内部调用其他微服务的方法。但如果其他微服务也需要与其他微服务或客户端进行通信,它们同样需要将自己的网络地址和端口信息注册到服务发现机制中,以便其他部分能够找到它们并与之通信。

所以,微服务的注册发现机制仍然是整个分布式系统的重要组成部分,确保了微服务之间的可用性、可扩展性和高效通信。即使在网关微服务中创建了实例,其他微服务仍然需要进行注册,以使整个系统能够正常运行。

实际上,即使其他微服务也使用创建实例的方式来访问其他微服务,服务发现机制仍然是有必要的。创建实例只是一种获取其他微服务地址和端口的手段,但服务发现机制提供了更多的优势和功能:

  1. 动态可用性和扩展性: 通过服务发现机制,微服务可以动态地注册和注销自己,使得整个系统能够自动感知服务的可用性和扩展性。当微服务的实例动态变化时,其他微服务和客户端可以及时发现这些变化。

  2. 负载均衡: 服务发现机制可以提供负载均衡功能,使得请求可以分布到不同的微服务实例上,从而平衡负载,提高系统的性能和可靠性。

  3. 故障转移和恢复: 如果某个微服务实例发生故障或不可用,服务发现机制可以帮助其他微服务自动切换到备用实例,实现故障转移和恢复。

  4. 集中管理: 服务发现机制提供了集中管理微服务注册信息的能力,使得整个系统的状态可以一目了然,并且可以方便地监控和管理微服务。

你可以在其他微服务中使用创建实例的方式来访问其他微服务,使用服务发现机制能够带来很多优势,特别是在大规模、复杂的分布式系统中。

因此,当一个微服务想要调用另一个微服务的方法时,它通常需要以下步骤:

  1. 服务发现: 首先,调用微服务需要知道目标微服务的网络地址和端口。这就是服务发现的过程。微服务可以从注册中心(例如 etcd)中查询目标微服务的位置信息,包括其 IP 地址和端口。

  2. 创建客户端实例: 一旦微服务获得目标微服务的位置信息,它就可以使用这些信息来创建相应的客户端实例。这个客户端实例将用于发送请求到目标微服务。

  3. 调用方法: 创建了客户端实例后,微服务可以通过该客户端实例调用目标微服务的方法,将请求数据发送到目标微服务,然后等待响应。

所以,服务发现是调用其他微服务的前提。微服务需要知道目标微服务的位置,才能够创建对应的客户端实例并发起请求。注册中心(etcd)的作用在于帮助微服务在服务发现阶段找到目标微服务的位置信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idMiFeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值