文章目录
一、先谈谈微服务
微服务是一种架构模式或者说是一种架构风格,它提倡将单一应用程序分成一组小的服务,每个服务运行在其独立的进程中,服务之间互相协调、互相配合,为用户提供最终价值,服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API,而Dubbo是采用了RPC作为通信机制,即远程过程调用协议),每个服务都围绕着具体的业务进行构建,并能够独立地部署到生产环境、类生产环境等,而且还可以使用不同的开发语言来编写各个服务,或是使用不同的数据存储技术。
简而言之:微服务就是将传统的一站式服务拆分为一个一个的服务,每个服务提供单个业务功能,也就是一个服务做一件事,彻底去耦合。
下面来一张 Martin Fowler个人博客上的图片,左边是整体,右边是微服务。可以看出,传统的一站式服务每次有更改都会重新部署整个服务,有很强的连坐概念,而微服务的每个模块之间互不影响,只需要部署有更改的某个业务所对应的服务即可。

1.微服务的优点
- 每个服务足够内聚、足够小;
- 开发简单、效率高,每个服务可以被一个很小的团队开发;
- 微服务是松耦合的,无论是在开发或是部署阶段都是独立的,每个服务又可以使用不同的开发语言或是不同的数据存储技术;
- 易于和第三方应用集成,易于被开发人员理解、修改和维护;
- 微服务只是业务逻辑的代码,不会和界面组件混合开发。
2.当然 有优点也有缺点
- 开发人员需要处理分布式系统的复杂性;
- 随着服务的增加,运维的压力随之增加;
- 系统部署依赖,服务间的通信成本,数据一致性。
3.微服务技术栈
| 微服务 | 相关技术 |
|---|---|
| 服务开发 | Spring Boot、Spring、SpringMVC |
| 服务配置与管理 | Netflix公司的Archaius、阿里的Diamond等 |
| 服务注册与发现 | Eureka、Consul、zookeeper等 |
| 服务调用 | Rest、RPC、gRPC |
| 负载均衡 | Ribbon、Nginx |
| 服务接口调用(客户端调用服务的简化工具) | Feign等 |
| 消息队列 | Kafka、RabbitMQ、ActiveMQ等 |
| 服务配置中心管理 | Spring Cloud Config、Chef等 |
| 服务路由(API网关) | Zuul等 |
| 全链路追踪 | Zipkin、Brave、Dapper等 |
| 服务部署 | Docker、OpenStack等 |
| 数据流操作开发包 | Spring Cloud Stream |
| 事件消息总线 | Spring Cloud Bus |
由此可见,微服务技术栈内容繁多!于是~
二、微服务解决方案——Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有开发什么新的东西,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 该内容参考文章 来自一个大佬对Spring Cloud的讲解 个人觉得这篇文章写得很好。
用一句话来说:Spring Cloud就是上面微服务技术栈里那些相关技术的有序集合,它是微服务架构下的一站式解决方案,俗称微服务全家桶。
1.Spring Boot和Spring Cloud的关系
- Spring Boot专注于快速方便的开发单个个体服务;
- Spring Cloud是关注全局的微服务协调治理框架,它将Spring Boot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供集成服务;
- Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖关系。
2.Spring Cloud核心子项目
- Spring Cloud Netflix:核心组件,包括Eureka(服务治理组件,包含服务注册与发现)、Ribbon(客户端负载均衡的服务调用组件)、Feign(基于Ribbon和Hystrix的声明式服务调用组件)、Hystrix(容错管理组件,实现了熔断器)、Zuul(网关组件,提供智能路由、访问过滤等功能)、Archaius(外部化配置组件);
- Spring Cloud Config:配置管理工具,实现应用配置的外部化存储,支持;
- Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以及触发后续的处理;
- Spring Cloud Security:基于spring security的安全工具包,为我们的应用程序添加安全控制;
- Spring Cloud Consul:封装了Consul操作,Consul是一个服务发现与配置工具(与Eureka作用类似),与Docker容器可以无缝集成;
- 。。。。。。
3.Spring Cloud Netflix:Eureka服务注册与发现
Eureka可以说是Spring Cloud的门神,它是Spring Cloud Netflix(据说是一个视频公司,由于访问量很大,自己开发了一套微服务架构,后来他们将这套微服务架构开源了)的一个组件,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。其功能类似于dubbo的注册中心Zookeeper。
Eureka的设计遵循AP原则,其主要架构思路:采用CS设计架构,Eureka Server作为服务注册中心,系统中的其它微服务,通过Eureka的客户端连接到Eureka Server并维持心跳连接,系统的维护人员可以通过Eureka Server来监控系统中的各个微服务是否正常运行。

每个微服务节点启动后,都会在Eureka Server中进行注册,所以Eureka Server的服务注册表中存储着所有可用节点的信息,节点信息都可以在界面中直观看到。
Eureka Client是一个Java客户端,用于简化Eureka Server的交互,同时在应用启动后将会周期性的向Eureka Server发送心跳(默认30s,内置的,使用轮询负载算法的负载均衡器),如果Eureka在多个时间周期没有收到某个节点的心跳,将会从服务注册表中将这个服务节点移除(默认90s)。
a.将Eureka引入到项目中去
这个项目构建过程参考我的另一篇笔记使用IDEA构建多模块项目,废话就不多说了,直接开始整!
和上一篇笔记一样的方式,新建一个Module,取名为microservice-eureka,在resources下创建application.yml,其内容如下:
server:
port: 7001
eureka:
instance:
hostname: localhost #服务端实例名称
client:
register-with-eureka: false #不向自己注册自己,自己注册了自己的话 运行的时候可能会报下面的异常
fetch-registry: false #表示自己就是注册中心
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka #注册与发现服务所依赖的地址
jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)
新增SpringBoot启动类
package com.mezjh.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author zjh
* @date 2019/11/28
*/
@SpringBootApplication
/**
* 开启Eureka server
*/
@EnableEurekaServer
public class EurekaStarter {
public static void main(String[] args) {
SpringApplication.run(EurekaStarter.class, args);
}
}
直接启动来看看效果吧,至于到底有没有启动成功,可以像Tomcat一样,访问上述端口,可以看到下面这张图片,代表已经成功了:

接下来修改microservice-provider里面的内容,把它注册到Eureka里面,首先引入maven依赖,
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
引入这个maven依赖之后,需要删除之前的spring-boot-starter包,不然运行的时候会报错,引入jar包之后,在application.yml里面添加以下代码
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka
这表示它要将自己注册到哪里去,就是上面我们新建的那个Module,在SpringBoot启动类上面增加以下注解,代表它是Eureka客户端
@EnableEurekaClient
接下来运行microservice-eureka和microservice-provider,再访问http://localhost:7001/的时候,看下图

图中可以看到此时多了一个MICROSERVICE-PRO服务,它的名字的由来其实就是application.yml配置文件里面的spring.application.name

b.Eureka集群的搭建
这里和microservice-eureka步骤一样,分别创建microservice-eureka02、microservice-eureka03。
修改主机hosts文件,添加下列内容:
127.0.0.1 mezjh1
127.0.0.1 mezjh2
127.0.0.1 mezjh3
将microservice-eureka的application.yml修改成如下,02和03也是如下配置,将每一个Eureka指定其它两个Eureka Server:
server:
port: 7001
context-path: /eureka
eureka:
instance:
hostname: mezjh1 #服务端实例名称
client:
register-with-eureka: false #不向自己注册自己
fetch-registry: false #表示自己就是注册中心
serviceUrl:
defaultZone: http://mezjh2:7002/eureka,http://mezjh3:7003/eureka
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka #注册与发现服务所依赖的地址
4.Spring Cloud Netflix:Ribbon负载均衡
Ribbon也是Netflix的一个组件,是一套客户端负载均衡的工具,它主要是提供客户端的负载均衡算法,将Netflix的中间层服务连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单来说,就是在配置文件中列出Load Balancer(负载均衡,简称LB,它是微服务或分布式集群中经常用的一种应用,可以将用户的请求平摊的分配到多个服务上,从而达到系统的高可用)后面所有的机器,Ribbon会自动基于某些规则(如简单连接、随机轮询等)去连接这些机器,我们也很容易使用Ribbon去实现自定义的负载均衡算法。
a.将Ribbon引入到项目
Ribbon既然是一套客户端的负载均衡工具,那么我们需要在microservice-customer中的pom添加如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
修改application.yml文件
server:
port: 80
servlet:
context-path: /microservice-cus
eureka:
client:
register-with-eureka: false #自己不能注册
service-url:
defaultZone: http://mezjh1:7001/eureka,http://mezjh2:7002/eureka,http://mezjh3:7003/eureka #Eureka集群
这时打开CustomerController这个类,发现它是用restTemplate在干活,我们此刻要让它在干活的时候自带负载均衡效果,这个时候打开它的BeanConfig,加上注解@LoadBalanced,该类当前如下:
package com.mezjh.cloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author zjh
* @date 2019/11/28
*/
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
客户端本身需要与Eureka整合,于是在它主启动类上添加注解@EnableEurekaClient,修改CustomerController的请求地址为微服务的名字,让它此时在访问微服务。
private static final String REQUEST_URL_PREFIX = "http://MICROSERVICE-PRO";
最后,我们来测试一下代码,依次启动每一个微服务…待续
本文详细介绍了微服务架构的优势和挑战,并探讨了SpringCloud作为微服务解决方案的角色。重点讲解了SpringCloud中的Eureka服务注册与发现,以及Ribbon的负载均衡功能,包括如何将服务注册到Eureka集群以及如何配置和使用Ribbon实现客户端负载。此外,还提供了Eureka集群搭建和Ribbon在实际项目中的应用示例。

被折叠的 条评论
为什么被折叠?



