Spring Cloud概念及Feign使用方法简介

一、集群、分布式和微服务

集群是指多个服务器通过局域网或其他连接方式进行连接,可以被看作同一台服务器,协同完成工作,来提高性能或可靠性。这些服务器,应该也可以通过同一个ip进行访问。

分布式是指一个业务拆成多个子业务,部署在不同的服务器上以提高效率。

集群和分布式并不冲突,也有分布式集群,即既将一个大的业务拆成不同的子业务,同一个子业务也可以用好几台机器。

微服务其实就是一个个分割而成的子业务,又或者说,一个个组件。在我眼里分布式主要侧重于“部署在不同的服务器”,指的是物理机器,而微服务就是指拆出来的子业务。

二、服务治理框架:Eureka

Eureka用于解决子系统之间的通讯问题。调用服务需要知道对方的ip和端口,如果写死在代码里,一旦某个服务换了ip,所有调用方都需要修改代码,非常麻烦。所以服务治理框架做的一件事其实就是“帮忙寻址”。

Eureka Client分为服务提供者和服务消费者,当然很多服务既是提供者也是消费者,如果只是消费者,那么不需要将自己的信息注册到Eureka中。如果是服务提供者,那么需要将自己的信息注册到Eureka中,消费者可以通过服务名来调用注册的服务,而不再通过IP地址来调用。

顺便提一嘴,consul也是为了实现相同的功能

三、远程调用工具类:RestTemplate

一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用。可以使用Spring封装好的RestTemplate工具类,使用起来很简单:

    // 传统的方式,直接显示写死IP是不好的!
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
	
	// 服务实例名
    private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";

    /**
     * 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
     * ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
     */
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/dept/add")
    public boolean add(Dept dept) {
        return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    }

四、Spring Cloud Feign

Spring Cloud Feign基于 Netflix Feign 实现,整合了 Spring Cloud Ribbon 与 Spring Cloud Hystrix, 除了整合这两者的强大功能之外,它还提供了声明式的服务调用(不再通过RestTemplate)。
使用方法:
1、SpringbootApplication启动类加上注解@EnableFeignClients@EnableDiscoveryClient
2、使用@FeignClient注解,name和value属性均可用于指定服务名;url属性一般用于调试程序,允许我们手动指定@FeignClient调用的地址;path属性定义当前FeignClient的路径统一前缀。

@FeignClient(name = "xxx", path = "xxx")
public interface xxxClient {
	@Path("xxx/xxx") //需要访问的路径,注意前面写了path这里去前缀
    @POST
    Result<Yyy> xxx(Xxx xxx);
}

这里的访问路径用的是@Path(“xxx/xxx”),但是我看很多博客用的是@RequestMapping,暂时不是特别清楚这两个的区别…
此时上面的Client类已经可以在自己组件的其他类中使用@Autowired注入使用啦!
然后如果其他组件deploy了接口我们可以直接依赖的话,只需要在maven中引入依赖,client只需要如下这样就可以了,不需要在里面写任何方法:

@FeignClient(name = "xxx", path = "xxx")
public interface xxxClient extends XxxService{

}

五、简单了解负载Ribbon和Hystrix

Ribbon

客户端负载均衡(Ribbon)服务实例的清单在客户端,客户端进行负载均衡算法分配。(从上面的知识我们已经知道了:客户端可以从Eureka Server中得到一份服务清单,在发送请求时通过负载均衡算法,在多个服务器之间选择一个进行访问)
服务端负载均衡(Nginx)服务实例的清单在服务端,服务器进行负载均衡算法分配。

Ribbon是支持负载均衡,默认的负载均衡策略是轮询,我们也是可以根据自己实际的需求自定义负载均衡策略的。

@Configuration
public class MySelfRule
{
	@Bean
	public IRule myRule()
	{
		//return new RandomRule();// Ribbon默认是轮询,我自定义为随机
		//return new RoundRobinRule();// Ribbon默认是轮询,我自定义为随机
		
		return new RandomRule_ZY();// 我自定义为每台机器5次
	}
}

实现起来也很简单:继承AbstractLoadBalancerRule类,重写public Server choose(ILoadBalancer lb, Object key)即可。

Hystrix

在高并发的情况下,由于单个服务的延迟,可能导致所有的请求都处于延迟状态,甚至在几秒钟就使服务处于负载饱和的状态,资源耗尽,直到不可用,最终导致这个分布式系统都不可用,这就是“雪崩”。

针对上述问题, Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。
Fallback(失败快速返回):当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝), 向调用方返回一个错误响应, 而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
资源/依赖隔离(线程池隔离):它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响, 而不会拖慢其他的依赖服务。
Hystrix提供几个熔断关键参数:滑动窗口大小(20)、 熔断器开关间隔(5s)、错误率(50%)
每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。

六、参考文章

外行人都能看懂的SpringCloud,错过了血亏!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Gateway 本身并不能直接使用 FeignFeign 是一个用于声明式、模板化 HTTP 客户端的库,它可以帮助我们更方便地编写基于 HTTP 的服务调用代码。但是 Spring Cloud Gateway 更多地是作为一个 API 网关来使用,用于在微服务架构中进行请求路由、限流、熔断等操作。 虽然 Spring Cloud Gateway 和 Feign 都是基于 Spring 框架的,但它们的使用场景和功能不同,不能直接进行集成。不过,在实际的项目中,我们通常会同时使用 Spring Cloud Gateway 和 Feign 来完成不同的任务。比如,我们可以使用 Spring Cloud Gateway 进行路由、过滤等操作,而使用 Feign 进行服务间的调用。 ### 回答2: Spring Cloud Gateway 确实无法直接使用 Feign 进行服务间的通信。这是因为 Spring Cloud Gateway 和 Feign 是两个不同的组件,具有不同的设计理念和用途。 Spring Cloud Gateway 是一个基于 Spring WebFlux 和 Reactor 的网关服务,用于处理请求路由和转发。它支持使用各种方式定义路由规则,并且具有强大的过滤器功能,可以对请求进行修改和验证。Spring Cloud Gateway 更加注重对请求的处理和转发,而不是直接进行服务间的通信。 相比之下,Feign 是一个基于注解的轻量级 HTTP 客户端,用于服务间的通信。通过定义接口和注解,Feign 可以帮助我们简化 HTTP 请求的编写和发送,从而实现服务之间的互通。Feign 的设计初衷是为了简化服务间通信的代码编写和维护,而不是用于路由和转发请求。 然而,我们可以在 Spring Cloud Gateway 中使用 WebClient 进行服务间的通信。WebClientSpring WebFlux 提供的用于发送 HTTP 请求的非阻塞客户端。我们可以在 Gateway 的过滤器中使用 WebClient 发送请求到目标服务,然后将响应返回给客户端。 综上所述,尽管 Spring Cloud Gateway 无法直接使用 Feign 进行服务间的通信,但我们仍然可以利用 WebClient 在 Gateway 中实现服务间的通信。这种方式可以更好地符合 Spring Cloud Gateway 的设计理念和用途。 ### 回答3: Spring Cloud Gateway和Feign是两个完全不同的组件,分别属于Spring Cloud的不同子项目。Spring Cloud Gateway是一个基于Spring Framework5,Spring Boot2和Project Reactor的新一代微服务网关,主要用于路由请求和进行过滤处理。而Feign是一个声明式的HTTP客户端,用于在微服务之间进行远程服务调用。 不能说Spring Cloud Gateway无法集成Feign,因为它们并不是相互替代的关系。在使用Spring Cloud Gateway时,一般是将Feign用作微服务之间的远程服务调用工具,而不是直接集成到Spring Cloud Gateway中。 当需要在Spring Cloud Gateway中进行远程服务调用时,可以使用Spring WebFlux提供的WebClient来实现。WebClient是一个响应式的HTTP客户端,可以用于发送请求并接收响应。通过使用WebClient,可以轻松地在Spring Cloud Gateway中进行远程服务调用。 总结来说,虽然Spring Cloud Gateway本身不直接支持Feign,但可以使用Spring WebFlux提供的WebClientSpring Cloud Gateway中进行远程服务调用。在使用Spring Cloud Gateway时,可以结合Feign在微服务之间进行远程服务调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值