springCloud-微服务

1.概述

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
“微服务架构”在这几年非常的火热,以至于关于微服务架构相关的开源产品被反复的提及(比如:netflix、dubbo),Spring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。

那么什么是“微服务架构”呢?简单的说,微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用。

2.为什么使用Spring Cloud?

Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当前Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

3.应用Spring Cloud

Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

4.Spring Cloud Eureka

Spring Cloud可以将服务模块从系统中剥离出来,形成独立的业务组件。通过服务发现注册功能,将业务服务组件发布到服务注册中心,让其他应用进行访问。
Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。

创建服务注册中心

本章学习中,我们使用Spring Cloud Eureka来实现服务治理,Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。
在Spring Tool Suite工具中,右键点击项目视图空白处,选择菜单New  Spring Starter Project后,填写项目信息。


点击Next按钮后,选择依赖的类库,Spring Boot Version请选择最新版

    点击Finish按钮即可

项目创建完成后,自动创建RegistryCenterApplication类,在类前增加注解@EnableEurekaServer
application.properties文件中,增加配置信息

...
spring.application.name=eureka-server
server.port=1001
eureka.instance.hostname=127.0.0.1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
...
在Spring Tool Suite工具的Boot Dashboard视图中,可以看见刚刚创建的项目


选择项目,点击视图中左上角的启动按钮后。双击项目查看效果


如果eureka服务页面正常显示,那么注册中心创建成功。

增加会员服务

创建会员服务,在注册中心中进行注册。
在Spring Tool Suite工具中,右键点击项目视图空白处,选择菜单New  Spring Starter Project后,填写项目信息


点击Next按钮后,选择依赖的类库,Spring Boot Version请选择最新版


点击Finish按钮即可
项目创建完成后,自动创建MemberServiceServerApplication类,在类前增加注解@EnableDiscoveryClient
application.properties文件中,增加配置信息

...
spring.application.name=eureka-member-service
server.port=2001
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1001/eureka/
...
在Spring Tool Suite工具的Boot Dashboard视图中,可以看见刚刚创建的项目



如果eureka服务页面增加了eureka-member-service服务,那么会员服务注册成功。

MemberServiceServer项目中,添加业务类DispatcherController

package com.atguigu.crowdfunding.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DispatcherController {

	@RequestMapping("/test")
	public String test() {
		return "member service !";
	}
}

重启项目后,访问http://127.0.0.1:2001/test。页面中显示member service !表示成功。

访问会员服务

当在注册中心注册了会员服务后,其他的任何应用都可以通过 feign方式从注册中心中获取会员服务。
在Spring Tool Suite工具中,右键点击项目视图空白处,选择菜单New  Spring Starter Project后,填写项目信息。




点击Finish按钮即可
项目创建完成后,自动创建MemberServiceClientApplication类,在类前增加注解
@EnableDiscoveryClient, @EnableFeignClients
在application.properties文件中,增加配置信息

...
spring.application.name=eureka-member-client
server.port=80

eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
...


在Spring Tool Suite工具的Boot Dashboard视图中,可以看见刚刚创建的项目



在MemberServiceClient项目中,添加服务访问类MemberClient

package com.atguigu.crowdfunding.client;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("eureka-member-service")
public interface MemberClient {
    @GetMapping("/test")
    String test();
}
@FeignClient("eureka-member-service")中的字符串内容应该和会员服务在注册中心注册的名称相同 eureka-member-service
在MemberServiceClient项目中,添加业务类DispatcherController调用会员服务MemberClient。
package com.atguigu.crowdfunding.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.atguigu.crowdfunding.client.MemberClient;

@RestController
public class DispatcherController {

	
	@Autowired
	private MemberClient memberClient;
	
	@RequestMapping("/test")
	public String test() {
		return memberClient.test();
	}
}
选择项目,点击视图中左上角的启动按钮后。
访问http://127.0.0.1/test。页面中显示member service !表示客户端访问会员服务成功。


5.Spring Cloud Ribbon

在服务发现Eureka中。我们使用了Feign方式读取Service应用中的数据,那如果多个Service应用提供相同的服务,这时候feign服务客户端访问哪一个Service应用就不确定了,所以此时需要一个类似于Nginx负载均衡器一样的软件或服务来进行调度。
Ribbon就是这样的一种技术,不过和Nginx区别在于,Ribbon是在feign客户端获取Eureka注册服务列表后进行的负载均衡(软负载均衡)。
feign服务中已经内置了Ribbon, 所以不需要额外的操作。

6.。Spring Cloud Hystrix

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.

在微服务架构中,一个请求需要调用多个服务是非常常见的


较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开


断路打开后,可用避免连锁故障。
代码实现时,首先需要在pom.xml文件中增加依赖关系

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
在程序的启动类中增加 @EnableHystrix注解开启Hystrix。
在调用feign服务的Controller方法前增加注解 @HystrixCommand(fallbackMethod="服务失败时调用的方法名")
服务调用失败时回调的方法声明应该和feign服务调用的方法声明保持一致
正确启动应用后,再关闭服务,测试断路器是否工作正常。




猜你喜欢

转载自blog.csdn.net/qq_40408317/article/details/80527807