springCloud是目前比较流行的微服务框架,它可以很方便很快捷的进行分布式项目的搭建,现在我们就用idea来创建一个简单的springCloud分布式集群案例
实现打开idea
1、新建一个maven父模块
将src目录删除
pom.xml如下
4.0.0
com.cloud.demo
cloudDemo
1.0-SNAPSHOT
pom
org.springframework.cloud
spring-cloud-starter-parent
Dalston.SR2
eureka-server
eureka-client
2、新建eureka-server子模块模块,此模块为注册中心模块,它本身即时一个服务
启动类如下:
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer //该注解,表示开启Eureka server功能
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
pom.xml:
4.0.0
com.example
eureka-server
0.0.1-SNAPSHOT
jar
eureka-server
Demo project for Spring Boot
com.cloud.demo
cloudDemo
1.0-SNAPSHOT
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-netflix-eureka-server
1.3.2.RELEASE
org.springframework.boot
spring-boot-maven-plugin
application.yml:
注意代码中符号 ‘—’并不是注释,而是分隔符,标识多个开发环境配置或者说多个服务实例配置,比如开发环境,测试环境,生产环境等。或者就是集群的多个服务实例配置
spring:
profiles:
active: master
application:
name: spring_cloud_eureka
---
spring:
profiles: master
server:
port: 8761
eureka:
instance:
hostname: master
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://slave:8762/eureka/
server:
enable-self-preservation: false
---
spring:
profiles: slave
server:
port: 8762
eureka:
instance:
hostname: slave
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://master:8761/eureka/
server:
enable-self-preservation: false
注意:本地搭建eureka server集群,所以需要修改本地hosts文件。windows系统电脑在C:WindowsSystem32driversetc,
mac操作系统通过终端vim/etc/hosts进行编辑修改,修改内容如下
127.0.0.1 master
127.0.0.1 slave
修改完成后保存hosts文件,不过window系统修改后不会马上起效果,我们需要重启电脑,或者清除本地dns缓存
清除缓存命令 ,打开cmd,输入 ipconfig /flushdns
然后我们启动项目,运行启动类,打开:http://master:8761会看到:
然后我们可以再将application.yml文件最上方的profiles.active 修改成slave,然后再重新启动
这样针对eureka-server注册中心服务我们就做到了集群配置
会发现在标签Instances currently registered with Eureka下面没有任何服务,其实此时没有任务服务属于正常现象,
因为我们还没有在注册中心中注册任何客户端服务实例,而注册中心的服务本身我们已经设置成禁止注册
如下
register-with-eureka: false
fetch-registry: false
所以,我们需要新建一个springboot项目,springCloud是依赖springboot的。
在idea父模块上右击新建project ,选择Spring Initializr
比如我们新建模块为eureka-client
主方法如下:
package com.example.eurekaclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //注册Eureka客户端
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
pom.xml如下:
4.0.0
com.example
eureka-client
0.0.1-SNAPSHOT
jar
eureka-client
Demo project for Spring Boot
com.cloud.demo
cloudDemo
1.0-SNAPSHOT
UTF-8
UTF-8
1.8
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
application.yml如下:
server:
port: 8081
spring:
application:
name: eureka-client
eureka:
client:
service-url:
defaultZone: http://master:8761/eureka/,http://slave:8762/eureka/
然后我们启动主方法,注意:前提是注册中心需要开启。
启动成功后我们打开http://master:8761
可以看到在Instances currently registered with Eureka标签下面出现一条记录,记录就是我们新建的客户端服务
当然我们的客户端服务可能因为用户量非常多,我们需要做成集群,多个服务实例。
其实很简单,只需要将端口修改一下即可,比如我们将端口修改成8082然后继续启动服务
这里需要修改一下运行配置,将Single instance only默认的勾选去掉,如下
可以看到在Instances currently registered with Eureka标签下服务多了一个端口为8082的实例,这样服务消费之调用服务时,就可以根据一定的算法来均衡调用服务,减轻服务的负担,
至于怎么均衡调用,我们可以在新建一个服务客户端来,该服务主要做的事情就是接受前端发送请求,经过一些权限认证和负载均衡算法然后确定调用那个服务,调用服务的方式有很多,个人推荐RestTemplate。当然SpringCloud在这方面已经有自己的一些api,比如处理网关方面的Zuul。
说到这,或许有仁兄问了,这个服务承载了所有的前端请求,压力那么大,万一崩溃了咋办? 集群!集群!集群!
重要的事情说三遍,涉及到这种关键的服务,集群的作用就体现出来了。
或许有的仁兄会问上面那行红字是什么意思,这里解释一下:
红字翻译为:自保模式被撤销。这可能无法保护网络/其他问题的情况下失效。
我们回到最上面搭建eureka-server注册中心时,application.yml配置文件中有这样一段代码:
server:
enable-self-preservation: false
该行代码标识服务自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true,这里我们修改为false。则自保模式被撤销,才会有这样的警告
接下啦我们做一下简单的负载均衡服务配置以及负载均衡测试
首先我们需要先新建一个负责负载均衡的服务项目,这里我们新建eureka-client1,和上面的eureka-client的新建方式一样。
新建项目完毕,我们需要在姓名中添加一些负载均衡方面的配置
pom.xml文件中新增:
org.springframework.cloud
spring-cloud-starter-ribbon
实现负载均衡我们这里通过RestTemplate和Ribbon结合实现。上面的maven依赖就是关于Ribbon插件,Ribbon插件配合RestTemplate简单的使用方式就是在注入RestTemplate的javaBean时,添加@LoadBalanced注解。如下:
我们在主方法中注入RestTempate,并添加@LoadBalanced注解让RestTemplate达到负载均衡的功能。然后我们新建一个Controller test,调用eureka-client服务的test接口。eureka-client服务之前没有添加test接口,现在我们在eureka-client中添加test接口:
@GetMapping("/test")
public String get(HttpServletRequest request){
return "request from "+request.getServerPort();
}
eureka-client1 主方法代码需要修改:
package com.example.eurekaclient1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@SpringBootApplication
@EnableEurekaClient
@Configuration
@RestController
public class EurekaClient1Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient1Application.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Resource
RestTemplate template;
@GetMapping("/test")
public String get(){
return template.getForObject("http://eureka-client/test",String.class);
}
}
application.yml配置文件:
spring:
application:
name: test-client
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://master:8761/eureka/,http://slave:8762/eureka/
然后我们刷新maven,启动eureka-client1项目,打开http://master:8761
可以看到Instances currently registered with Eureka标签下新增一条eureka-client1服务
然后访问:http://master:8083/test 然后不停刷新可以看到返回的信息端口在不停的切换
如此我们就简单的达到了一个负载均衡的效果,我们可以将eureka-client1服务当做负载均衡器,或者负载均衡设备。
负载均衡器获取前端发送的请求,根据请求参数,确定到底走后台哪个服务。然后在通过Ribbon的注解@LoadBalanced实现
的负载均衡功能确定到底走这个服务的哪个实例。所谓实例就是集群中的一台服务。
目前案例中只有一个客户端服务eureka-client(可以理解为业务系统,一个真实的管理系统或者网站),当然我们可以新建
更多的服务,如file-manager , book-manager等。
或许有仁兄会问,负载均衡承担了前端所有的请求,负载均衡服务本身可以负载均衡吗?
对此我只能……………………
到此为止一个简单的SpringCloud案例算是搭建完成,各路大神菜鸟多多指点