远程调用的问题

在之前的案例当中,我们有一个订单服务和一个用户服务。订单服务需要远程调用我们的用户服务,它采用的方式是发起一次h t t p 的请求。不过在我们的代码当中,我们是将user service 服务的i p 和端口硬编码在代码当中的。这样一种写法其实是有一定问题的。
image.png

在公司里面开发的时候,我们会有开发的环境、测试环境、生产环境等等。每一次环境的变更,可能服务的地址也会发生变变化。那如果采用硬编码的方式,难道说每一次都来重新修改代码编译打包吗?

而且为了将来应对更高的并发,我们的 user 服务可能会部署成多实例,形成一个集群。那么这个时候你的硬编码到底该写谁的地址呢?所以这里一定不能采用硬编码。那问题来了,如果我不做硬编码,那这个地址我该怎么样去获取呢?
image.png

服务调用出现问题:

  • 服务消费者该如何获取服务提供者的地址信息?
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供者的健康状态?

eureka原理

eureka 的结构当中,它分成了两个概念、两个角色。第一个角色是有一个server,就是服务端,它名字叫做注册中心,起到的作用是记录和管理这些微服务。而第二个角色就是我们的user service服务提供者和order service 服务消费者。不管是提供者还是消费者,都是微服务,所以统称为的客户端
image.png

user service在启动的那一刻会做一件事情:把自己的信息注册给Eureka。注意是每一个服务启动时都会做这件事。只要你是Eureka的客户端都会做这件事。
image.png

如果想要消费,比如说order service,就可以找Eureka寻找user service,这样第一个问题解决了。
image.png

拿到服务的列表信息了。我门还得挑一个,所以这个时候就会用到负载均衡的知识。从这三个里面挑一个出来再发请求。
image.png

会不会存在挑的地址对应服务挂了?提供者需要每隔三十秒钟都会向Erueka发一次心跳来确认一下自己的状态。不健康状态的就会被从列表去除,消费拉取服务时就不会感知到有这个服务。

消费者该如何获取服务提供者具体信息?

  • 服务提供者启动时向eureka注册自己的信息
  • Eureka保存这些信息
  • 消费者根据服务名称向eureka拉取提供者信息

如果有多个服务提供者,消费者该如何选择?

  • 服务消费者利用负载均衡算法,从服务列表中挑选一个

消费者如何感知服务提供者健康状态?

  • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
  • eureka会更新记录服务列表信息,心跳不正常会被剔除
  • 消费者就可以拉取到最新的信息

image.png


搭建EurekaServer

image.png
image.png
启动既可以看见一些管理信息
image.png

注意:如果发现启动报错,大概率是cloud和springboot版本冲突,需要对spring官网查看相互版本。


服务注册

c9520da3-35d0-4eef-b307-3c4f0aff9eda.png
对其他服务也进行这样的配置,然后启动就可以看到其注册了
image.png
image.png


服务发现

image.png
重新启动orderserver:
访问http://localhost:8080/order/102http://localhost:8080/order/10
image.png
image.png