目录
1.概述
2.环境
2.1.项目结构
2.2.项目架构
2.3.依赖
3.注册中心
3.1.配置使用
3.2.管理页
3.3.集群
4.服务注册
5.服务调用
5.2.Ribbon
5.3.Feign
5.4.OpenFeign
我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量称为“东西流量”。就“南北流量”而言微服务架构其实仍然是一个中心化的架构,这个中心是“目录”,因为需要一个“目录”来记录服务的相关信息(诸如部署在哪台服务器上),“南北流量”才能找得到服务。这个"目录"在微服务体系中被称为“注册中心”。注册中心是微服务体系中最重要的一个组件,在Netflix版本的spring cloud中,注册中心组件是——eureka。
服务提供者向注册中心(Eureka Server)中注册数据,消费者在注册中心(Eureka Server)中获取数据。系统中的微服务使用Eureka客户端链接到Eureka Server中,并且维持心跳(即固定时间向server发送信号,证明自己存活。)
以上整个流程中,有两个组件的参与:
在Netflix版的spring cloud中注册中心一直都是eureka,但是远程服务调用组件有好几个可选:
它们之间从上到下都是逐渐优化、取代的关系。
本文会首先讲使用eureka进行服务注册,然后顺序的讲以上几种远程服务调用组件的使用和其相较于前一个的优化点在哪里。
整个示例项目用标准的maven结构,分为三个子module:
整个项目的依赖的版本管理在最顶层的父级pom.xml中进行。
整个示例项目之所以分为三部分是希望在服务调用者和服务之间使用通信组件来展示如何结合注册中心来进行服务间的通信:
spring官网,进入spring cloud的项目,项目首页详细记录着Netflix版本的spring cloud和spring boot之间的版本对应关系:
本项目我们选取spring boot 2.6.X和spring cloud Netflix aka jubilee。
在最顶级的父pom中引入依赖:
2021.0.7
2.6.10
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
依赖:
配置:
启动:
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain {
public static void main(String[] args) {
SpringApplication.run(EurekaMain.class);
}
}
通过IP+端口号的方式可以访问到eureka server的管理页:
整个管理页里面最重要的一部分是框起来的这部分,这部分显示的是注册在当前eureka server上的服务有哪些,目前还没有服务注册,所以没有显示任何东西。
eureka支持集群模式用于相互冗余容灾。eureka集群的配置很简单,没必要单独写了例子,以下是博主之前做的eureka的集群配置文件,看后会一目了然。
在每个eureka上关联其它eureka:
服务注册到所有eureka上:
注册中心已经准备好了,接下来我们要准备一个服务,将它注册到配置中心上。
依赖:
配置:
启动:
@SpringBootApplication
@EnableEurekaClient
public class UserServiceMain {
public static void main(String[] args) {
SpringApplication.run(UserServiceMain.class,args);
}
}
启动服务后,可以在eureka server上查看服务是否已经注册:
准备好注册中心、注册好服务后,接下来就是如何调用服务的问题了。也就是如何用以下几种组件来调用服务:
ribbon只是一个负载均衡组件,需要依赖于其它HTTP通信组件来实现通信,一般用ribbon+spring boot自带的RestTemplate。
依赖:
eureka的以来里集成了ribbon,所以要使用ribbon来调服务的时候,直接引入eureka的依赖即可。
配置:
@LoadBalanced用来将RestTemplate托管给ribbon来管理。
服务调用:
ribbon+restTemplate可以完成服务的调用以及负载均衡,但是存在一个很明显的地方就是服务名直接写死,不便于维护。srping体系中主体思想是依赖倒置,也就是面向接口编程,所以社区推出了Feign,其封装了ribbon和http请求工具,使得其除了能完成负载均衡和http请求以外,可以面向接口编程来完成服务调用。
依赖:
服务层:
结果:
feign面向接口的、声明式的服务调用组件,其封装了ribbon,目的是简化服务调用代码,使得服务调用具有rest风格。Openfeigin是feigin的升级版,增强了对springMVC注解的支持。
以上是博主写过的一个OpenFeign的示例。
依赖:
启动:
服务层:
服务调用: