内容
SpringBoot整合SpringCloud的Eureka、Zuul等组件,快速实现简单易懂且具有服务熔断、负载均衡的分布式架构1.0,体验微服务的魅力。
版本
IDE:IDEA 2017.2.2 x64
JDK:1.8.0_171
manve:3.3.3
SpringBoot:1.5.9.RELEASE
SpringCloud:Dalston.SR1
适合人群
?Java开发人员
说明
转载请说明出处:SpringCloud从入门到进阶(四)——使用SpringBoot搭建微服务
参考
SpringCloud从入门到进阶(二)——注册中心Eureka
步骤
pom.xml
在原有SpringBoot项目的基础上增加SpringCloud依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> ? <groupId>com.zih.jms</groupId> <artifactId>idlegood</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> ? <name>idlegood</name> ? <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> </parent> ? <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <!--添加1:在dependencyManagement标签中声明SpringCloud的版本, 所有的SpringCloud组件的依赖都将使用该版本SpringCloud中规定的版本号 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--添加2:SpringCloud相关依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- SpringBoot相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--actuator依赖 Spring Boot提供的项目运行状态监控功能--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ...其他省略 </project>
yaml
#添加3:eurekaSever配置 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka spring: #添加4:设置springboot项目的应用名称,并默认启动peer1 application: name: application-idleGoodService #注意:此处的名称一定要个路由接入服务器中的配置名一致 profiles: active: peer1 datasource: ... #省略原有Springboot项目的数据源、redis、mybatis、分页等配置 #添加5:增加日志输出,指明日志存放位置;同时需要在资源路径下引入配置文件 logging: file: logs/application-idleGoodService-${server.port}.logs ? #添加6:增加peer1和peer2两种profiles的配置 --- spring: profiles: peer1 server: port: 8001 eureka: instance: instance-id: springcloud-idleGoodService-8001 management: port: 8101 security: enabled: false --- spring: profiles: peer2 server: port: 8002 eureka: instance: instance-id: springcloud-idleGoodService-8002 management: port: 8102 security: enabled: false
SpringApplication
//开启EurekaClient @EnableEurekaClient @SpringBootApplication ...//包扫描、Swagger、事务的配置省略 public class IdlegoodApplication { ? //一些bean的注入和创建省略 ... public static void main(String[] args) { SpringApplication.run(IdlegoodApplication.class, args); } }
Controller
@RequestMapping("/test") @RestController public class DemoController { ? @PostMapping("/demoTest/{name}") public String demoTest(@PathVariable(value = "name") String name, @RequestParam(value = "from") String user){ return "Hello "+name+",this is DemoTest.From "+user+" ."; } }
本地测试
使用postman请求Controller,测试通过
打包
在命令行工具中进入项目pom文件所在路径,然后执行mvn clean package打包。
过程可参考:SpringCloud从入门到进阶(二)——注册中心Eureka
拷贝
使用Bitvise SFTP或WinSCP等工具将jar包上传到有公网的服务器,再使用scp命令将jar包拷贝到两台Web API服务器普通用户的~/jars路径下。
过程可参考:SpringCloud从入门到进阶(二)——注册中心Eureka
修改hosts文件
用于访问EurekaSever,微服务内部之间的调用不需要经过接入服务器。将内部域名eureka7001.com、eureka7002.com、eureka7003.com绑定到局域网IP 172.26.125.118。
#IP 域名 别名 [[email protected] jars]$ sudo vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.26.125.118 eureka7001.com 172.26.125.118 eureka7002.com 172.26.125.118 eureka7003.com
过程可参考:SpringCloud从入门到进阶(二)——注册中心Eureka
运行
分别在两台Web API服务器上执行一下两条命令,启动微服务
java -jar idlegood-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 & #服务器A java -jar idlegood-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 & #服务器B
访问EurekaSever,确认服务正常启动。
先使用Postman直接请求Web API服务器的接口
确保Web API服务器配置无误后再使用Postman请求路由接入服务器的接口。
由于一个微服务中有多个实例,路由接入服务器会自动在这些实例之间进行负载均衡。
注意:笔者在这一步遇到了请求路由接入服务器接口时,接口服务熔断。
观察路由接入服务器中项目的日志
2018-10-23 19:09:01.809 INFO 9621 --- [nio-7081-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client application-idleGoodService initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=application-idleGoodService,#下面这句可以看出,EurekaServer默认是按“主机名:端口号”的形式存储EurekaClient的信息current list of Servers=[iz8vb6a56ld0vy6vuaijriz:8002, iz8vb6a56ld0vy6vuaijrjz:8001],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:2;Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
可以看到路由接入服务器已经从Eureka中读取到了微服务的信息,但是是“主机名:端口号”的形式。将所有微服务的主机名和内网IP地址的映射添加到路由接入服务器的hosts中即可解决该问题。
关闭
关闭java程序请参考:Linux入门实践笔记(二)--Jar包运行与关闭
注意
命令、代码拼写完一定要认真检查,尤其是大小写,空格等,避免因为马虎造成莫名的错误。
原文地址:https://www.cnblogs.com/lonelyJay/p/9842175.html