spring cloud项目搭建(二)-Feign声明式服务调用

嗯,实现功能还不简单?加个controller不就行了,然后访问该服务。是,自己访问自己没什么好说的。

但是

一个服务访问另一个服务呢?

一个服务通过Eureka找到另一个服务所在主机,所在端口,然后访问呢?

如何做负载均衡呢?

先看一下最终效果。

由于项目都在本地启动,所以不同项目用端口区分。8001,8011,为客户服务。下面图是客户服务自己调自己的相应展示。

8002为订单服务。下面图是订单服务调客户服务的相应展示。

订单服务调客户服务时,会根据Eureka注册中心发现的服务所在主机,端口按一定策略进行调用,即对同样的服务进行负载均衡。所以说订单服务调客户服务时,展示会根据页面刷新进行变化(当然,这只是进行相应的服务调用策略的测试,实际项目中,相同服务的逻辑肯定是一样的,毕竟一个服务部署在多台机器上,不是为了让项目变的不一样,而是为了不让一台机器挂了,系统就没法用了),所以说刷新时,对应订单服务调客户服务是动态获取的,这也体现了微服务的特点。

这些说完后,我们就进入正题吧。

 

 

 


不知道大家接触过一个系统调另一个系统不?也就是“传说中”的调接口。不管是socket方式,还是URLConnection方式,总得建立连接吧,然后传递参数,对返回结果进行解析等。微服务与微服务间也是两个独立的系统,所以这么复杂,该怎么调用呢? spring cloud自然是提供了解决方案的。那就是Feign的声明式调用。

在代码开始前,首先要明白几点。

我调其他服务,所以说具体实现肯定是在具体的被调服务里。(order服务调cust服务,具体实现肯定在cust服务里。)具体为什么会存在服务调服务,是因为大项目被分成若干小项目后,对应的表也被拆分了,原则上,微服务间的表是独立的,小的独立相当于一个数据库中的一个表只能存在于一个微服务里(order服务里有user表了,cust服务就不能有user表)。大的独立相当于数据库都不一样。

因为被调的服务存在多个,所以负载均衡也是在对应的被调服务里做的(order调cust,cust里做负载均衡)

首先,服务调用方的主启动类需要添加注解:

@EnableFeignClients

然后就需要用@FeignClient()注解找对应服务。由于调用方需要找对应服务,被调用方需要实现对应逻辑。所以说会把它独立出来,拆成一个公用代码,到时候调用方需要用时,直接在pom.xml引入,被调用方需要用时,也可引用。

所以:cust_interface不含主启动类,它相当于是个公用模块,就相当于Java的API,引入了就可以直接调用类方法。

cust_interface:

用到FeignClient()必须引入依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
    </dependencies>

 然后myOrderServe:

首先引入依赖:肯定要有cust_interface的依赖,因为要把接口注入。本来要有feign依赖的,但是依赖了cust_interface,cust_interface依赖了Feign,所以可以不用再引入Feign依赖。

 

然后给主启动类加注解:

@EnableFeignClients

最后写对应调服务的实现,即注入cust_interface对应的服务入口。

  最后myCustServe:

首先引入依赖:肯定要有cust_interface的依赖,因为要实现cust_interface的接口。

然后application.yml要有对应负载均衡的配置,因为Feign集成了Ribbon。

最后实现cust_interface接口,写具体要实现的内容即可。

然后启动myEurekaServe,myOrderServe,访问http://localhost:8002/getInfo?name=周亚娟 是访问不了的。因为它在EurekaServe上没有找到MYCUSTSERVE服务。然后启动myCustServe,再次访问,就发现可以访问到了。这是因为在EurekaServe上找到了MYCUSTSERVE服务。然后再启动myCustServe2,再次访问,再次刷新,会发现两次调用的不是同一个cust服务。这是因为默认使用Ribbon的自动轮询算法。发现服务存在多个时,会自动轮询调用。

 


服务调用的大致流程是:


1.主启动类启动后,发现@EnableFeignCleints注解,会进行包扫描,扫描所有的@ FeignClient的注解的类,并将这些信息注入到ioc容器中。
2.当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate,RequesTemplate在生成Request,Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp。

3.通过@FeignClient()对应的value值在EurekaServer上找到对应的服务名所在的主机端口。

4.根据一定的算法按一定算法对服务调用。
 

要是某个服务全挂了,等其他问题解决方案,看spring cloud项目搭建(三)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值