上次说完了SpringBoot,然后我们接下来说说Springcloud。
说到Springcloud,就不得不说说Eureka和Nacos两个,这两个都是注册中心,Eureka主要是充当服务的注册与发现。
另一个说的是Feign,而Feign是充当客户端调用,支持负载均衡。
要知道,Feign里面封装了ribbon,ribbon也是一个支持负载均衡的客户端。
先知道我要大致说的几个东西,先对它有个初步认识。
然后我弄个图,让大家看看。
下图为最开始的时候,我们会采用“直连”的方式来用项目A,直接请求项目B。
然后就变成了有服务中心的,如下图。
然后我们看一个多个项目直接的关系图,如下:
那我们再看看运用到服务中心的样子,如下:
这样的话,A调用B,B调用C都要通过注册中心,而不能直接调用。这样做的好处是什么呢?
要知道,上面的项目只是两三个相互之间的简单调用,但是如果项目超过20个30个呢,画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。
如果没注册中心的话,去调用一个远程的提供者或者说接口,我们肯定要写出它的IP和端口号,然后我们就会去写各种各样的ip地址和端口号,包括,一旦变动了,那程序里面的都要去变。
现在要是通过注册中心,再调用提供者这个远程接口,因为我们不再是直连的方式去访问。
通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用就可以了。
这里要注意的是,Eureka这个注册中心,它可不是什么第三方jar包需要按照什么的,Eureka它本身就是一个SpringBoot,也就是说我们用的是一个项目来充当注册中心。
然后我们来弄一个看看,还是和上章一样,新建一个项目
然后我们建一个eueka-server,如下:
然后,我们看下边。按照正常来说,应该是如下:
但是!我们还要清楚一件事:能通过图形界面做的事儿,都能通过pom去改。
所以我会在这里说一下,我要是不选怎么改!
那我们需要在pom.xml里面引入“Spring-cloud-starter-eureka-server”,
第二件事儿,引入一行
<spring-cloud.version>Edgware.SR4</spring-cloud.version>
然后再引入
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
<dependencyManagement>
当然,你也可以写成
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
<dependencyManagement>
一个道理。这就完成了。
然后我们就能到引入的依赖里会出现如下:
最重要的是前两个,第三个~不是很重要啊~
然后,等这一步完成之后我们就可以打开项目,就能看到如下:
我们能看到,项目上还是SpringBootApplication,它本身就是SpringBoot项目,我们需要在@SpringBootApplication下加一个注解
@EnableEurekaServer
这个注解主要是起到启用,或者说是启动的意思。
关键还是要配application.properties这个文件,配置如下:
#这一行是给这个注册中心起的名字,保证唯一性即可
spring.application.name=spring-cloud-eureka
#eureka注册中心指明totomcat的端口号
server.port=8000
#表示是否将自己注册到Eureka Server,默认为true。
eureka.client.register-with-eureka=false
#表示是否从Eureka Server获取注册信息,默认为true
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
#注:${server.port}对应的是server.port=8000里的“8000”端口号。
eureka.client.serviceUrl.deZaultZone=http://localhost:${server.port}/eureka/
#设置为false,关闭自我保护
eureka.server.enable-self-preservation=false
#清理间隔(单位毫秒,默认是60*1000)
eureka.server.eviction-interval-timer-in-ms=3000
呃,这里面最后两个是我自己搜来的,不加也行,主要是前几个
注册中心这一块儿暂时算完了
咱们就可以启动项目了,它这里面没有什么逻辑,它就是一个注册中心,就是pom里面的依赖,然后就是properties文件里面指明相关的信息。
直接在浏览器上输入
lolocallhost:8000
这就是eueka注册中心的控制台了(注意,这里的 Instances currently registered with Eureka 下还是空的)
这样完了以后还不行,我们现在做的配置只是顶多算是起了个名字,指明了端口号,地址这些东西,
那我们怎么把咱们的SpringBoot项目注册到注册中心上去?
那我们就需要把项目中其他的地方不变,先改application.properties文件
#唯一性的名字
spring.application.name=producer-api-provider
#指明tomcat的端口号
server.port=9000
#Eureks地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
pom.xml还要添加点东西,有的就算了
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
然后还需要在项目的启动类中添加@EnableDiscoveryClient注解
@EnableDiscoveryClient
@EnableDiscoveryClient就是让它做为 zookeeper 这个注册中心的客户端找到 Eureka 的服务器进行注册。
启动工程后,就可以在注册中心的页面看到PRODUCER-API-PROVIDER服务,如下。
我们可以看一下,Application下写的PRODUCER-API-PROVIDER,就是我们项目给起的唯一性的名字。
而后面的Status下的 ZGC-20170328ORY 就是计算机的名字,然后是冒号,署名,冒号端口号。
就是这些了。
再加别的项目的时候我还是强调一下吧,其他的还是按照刚刚的步骤,但是还是要保证!!!端口号的唯一性!要不然会冲突。
其他的都一样。
看我的,我又复制了一份项目改了改,看看效果。
归到一类了,就是因为只是端口号不一样。
同一个提供者有两台电脑,或者两个应用对他进行提供,一个崩溃了,还有一个,最起码,,,我们在界面上看到的是这样,因为测试嘛~我没写太复杂... ....
提供者就说到这里,然后就是说消费者,就是我们的客户端。
客户端里面pom.xml引入的还是和一开始创建eureka项目(服务提供者)引入的一样。
在启动类中添加@EnableDiscoveryClient注解,做为zookeeper的客户端。
还有一个注解,@EnableFeignClients
@EnableDiscoveryClient :启用服务注册与发现 @EnableFeignClients:启用feign进行远程调用
Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单,
它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。
Feign也支持可拔插式的编码器和解码器。
Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。
Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
然后就是调用这一块儿了,管他叫啥,这个不是约定优于配置,我的这样了先。
然后内容如下:
然后就是配置文件里面和引入feign的东西
端口号不能重复!
在pom.xml里面引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
接下来我们说说,我们刚刚弄的只是接口,怎么在客户端调用。
就可以了,启动看看,如下:
一个provider一个consumer,provider做了负载均衡(虽然就两台)
然后我们调用一下看看,这时我们可不是直接调提供者,而是去测消费者(consumer)
控制台也打印了,证明能走通。
那我们还可以这样试试,我们不是弄了两个提供者吗?
我们把其中一个提供者里面的值改了,如下:
然后我们看一下结果
它会出现两个结果,这证明了修改了的地方能起到效果,并且负载均衡起到作用了,因为他的结果时而不同,看的很明显了。
那我们把其中一个停了就会只展示一种一条结果,并且一直是这一种结果。