一、分布式服务架构的发展历程
第一代服务框架
Dubbo(Java)、Orleans(.Net)等
第二代服务框架
【Spring Cloud等】
第三代服务框架
Service Mesh(服务网格) => 例如Service Fabric、lstio、Linkerd、Conduit等
二、SpringCloud介绍
Spring提供了一系列工具,可以帮助开发人员迅速搭建分布式系统中的公共组件(比如:配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,主节点选举, 分布式session, 集群状态)。协调分布式环境中各个系统,为各类服务提供模板性配置。使用Spring Cloud, 开发人员可以搭建实现了这些样板的应用,并且在任何分布式环境下都能工作得非常好,小到笔记本电脑, 大到数据中心和云平台。
Spring Cloud官网的定义比较抽象,我们可以从简单的东西开始。Spring Cloud是基于Spring Boot的, 最适合用于管理Spring Boot创建的各个微服务应用。要管理分布式环境下的各个Spring Boot微服务,必然存在服务的注册问题。所以我们先从服务的注册谈起。既然是注册,必然有个管理注册中心的服务器,各个在Spring Cloud管理下的Spring Boot应用就是需要注册的client
Spring Cloud使用erureka server, 然后所有需要访问配置文件的应用都作为一个erureka client注册上去。eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳,在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。
Spring Cloud作为第二代微服务的代表性框架,已经在国内众多大中小型的公司有实际应用案例。许多公司的业务线全部拥抱Spring Cloud,部分公司选择部分拥抱Spring Cloud。例如,拍拍贷资深架构师杨波老师就根据自己的实际经验以及对Spring Cloud的深入调研,并结合国内一线互联网大厂的开源项目应用实践结果,认为Spring Cloud技术栈中的有些组件离生产级开发尚有一定距离,最后提出了一个可供中小团队参考的微服务架构技术栈,又被称为“中国特色的微服务架构技术栈1.0”:
三、Spring Cloud Netflix 概念
组件名 | 作用介绍 |
---|---|
Eureka | 服务治理组件,包含服务注册与发现 |
Feign | 基于Ribbon和Hystrix的声明式服务调用组件(使用的是HTTP协议) |
Ribbon | 客户端负载均衡的服务调用组件 |
Zuul | 网关组件,提供智能路由、访问过滤等功能 |
Hystrix | 容错管理组件,实现了熔断器 |
Archaius | 外部化配置组件 |
四、创建一个Eureka注册中心
1、选择三个组件:SpringBoot DevTools、Eureka Server、Spring Web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
2、添加配置【注册中心】
#配置Eureka服务 默认端口8761
server.port=7777
eureka.instance.hostname=localhost
#registerWithEureka:false和fetchRegistry:false表明自己是一个eureka server
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
3、启动类添加注解
@SpringBootApplication
//代表是尤里卡注册中心
@EnableEurekaServer
public class SpringcloudeurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudeurekaApplication.class, args);
}
}
4、启动项目访问;http://localhost:7777 、查看有哪些微服务(现在肯定是空)
五、创建一个Client微服务客户端【Client001】
1、选择三个组件:SpringBoot DevTools、Enreka Discovery Client、Spring Web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
2、添加配置【一个微服务】
# 设置服务端口
server.port=8881
# 设置服务名 可以相同、相同则为后面的负载均衡准备
spring.application.name=hello-service
# 设置注册中心地址
eureka.client.service-url.defaultZone=http://localhost:7777/eureka
3、添加Conroller处理器方法
@RestController
@RequestMapping("/student")
public class StudentController {
@RequestMapping("/index001")
public Object index001() {
return "student_index001";
}
}
4、启动类添加注解并进行测试
//@EnableEurekaClient 只支持Eureka注册中心,@EnableDiscoveryClient 支持Eureka、Zookeeper、Consul 这三个注册中心。
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudclientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudclientApplication.class, args);
}
}
六、创建另一个Client微服务客户端【Client002】并调用Client001【默认已实现负载均衡】
1、选择四个组件:SpringBoot DevTools、Enreka Discovery Client、Spring Web、OpenFeign
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
2、添加配置【一个微服务】
server.port=8080
spring.application.name=feign1
eureka.client.service-url.defaultZone=http://localhost:7777/eureka
3、定义远程调用Client001的接口
//value 服务名称
@FeignClient(value = "service1")
public interface FeignService1 {
@RequestMapping("/index1")
String test1();
}
4、定义远程调用代码
@RestController
public class TestController {
@Autowired
FeignService1 feign;
@RequestMapping("/test1")
public String test1(@RequestParam("name")String name){
System.out.println(name);
return "其他调用"+feign.test1();
}
}
5、启动类添加注解并进行测试
@SpringBootApplication(scanBasePackages = "packages")
@EnableEurekaClient
//扫描Feign包
@EnableFeignClients(basePackages = "packages")
public class Springcloudserver1Application {
public static void main(String[] args) {
SpringApplication.run(Springcloudserver1Application.class, args);
}
}