内容
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 开发人员
说明
参考
Linux 入门实践笔记(二)--Jar 包运行与关闭
SpringCloud 从入门到进阶(二)-- 注册中心 Eureka
步骤
项目路径
pom.xml
- <?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">
- <parent>
- <artifactId>springcloud</artifactId>
- <groupId>com.leo</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>gateway-service-7081-7082</artifactId>
- <dependencies>
- <!--zuul 组件实现网关的路由转发和负载均衡 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-zuul</artifactId>
- </dependency>
- <!--eureka client-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-eureka</artifactId>
- </dependency>
- <!--actuator 监控 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- </dependencies>
- <!-- Spring Boot 的 Maven 插件, 使用 Maven 插件的方式来启动 Spring Boot 工程
- 如果不添加该插件在使用 mvn 命令打包的 jar 有问题, 执行时会报错: xxx.jar 中没有主清单属性 -->
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
- YAML
本示例暂不配置 Zuul 的高可用, peer2 的配置注释掉.
- spring:
- application:
- name: application-gatewayservice
- profiles:
- active: peer1
- #Zuul 的配置
- zuul:
- prefix: /jms #通过 zuul.prefix 的配置, 所有请求统一增加前缀, 可以实现 API 接口的版本号控制, 注意前缀要加 /
- #如果某服务存在多个实例, Zuul 结合 Ribbon 会做负载均衡, 将请求均分的部分路由到不同的服务实例.
- routes:
- culturalService: #此处的名称是用户自定义的, 需要指定它的 path 和 serviceld, 两者配合使用, 就可以将指定类型的请求 Uri 路由到指定的 Serviceld
- path: /cultural/** #以 / cultural/** 开头的请求都转发给 springcloud-culturalService
- serviceId: application-culturalService #此处是 spring 的 applicationname, 即 Eureka 的服务名, 而非 instance-id 实例名.
- idleTimeService:
- path: /idleTime/**
- serviceId: application-idleTimeService
- idleGoodService:
- path: /idleGood/**
- serviceId: application-idleGoodService
- topicService:
- path: /topic/**
- serviceId: application-topicService
- publicWelfareService:
- path: /publicWelfare/**
- serviceId: application-publicWelfareService
- commonService:
- path: /common/**
- serviceId: application-commonService
- # 指明日志存放位置
- logging:
- file: logs/application-gatewayservice-${server.port}.logs
- eureka:
- client:
- service-url:
- defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
- ---
- spring:
- profiles: peer1
- server:
- port: 7081
- eureka:
- instance:
- instance-id: springcloud-gatewayservice-7081
- management:
- port: 7181
- security:
- enabled: false
- #---
- #spring:
- # profiles: peer2
- #server:
- # port: 7082
- #
- #management:
- # port: 7182
- # security:
- # enabled: false
- #
- #eureka:
- # instance:
- # instance-id: springcloud-gatewayservice-7082
- SpringApplication
- @EnableZuulProxy // 开启 Zuul 的功能
- @SpringBootApplication
- @EnableEurekaClient
- public class GatewayServiceApplicaton {
- public static void main(String[] args) {
- SpringApplication.run(GatewayServiceApplicaton.class,args);
- }
- }
- logback-spring.xml
- <!-- 加载日志文件 -->
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/base.xml"/>
- <jmxConfigurator/>
- </configuration>
- Zuul 断路器
- @Component
- public class MyFallbackProvider implements ZuulFallbackProvider {
- /**
- * getRoute()方法, 用于指定熔断功能应用于哪些路由的服务.
- * 如果需要所有的路由服务都加熔断功能, 只需要在 getRoute()方法上返回 "*" 的匹配符,
- */
- @Override
- public String getRoute() {
- return "*"; // 所有路由服务都增加熔断.
- }
- /**
- * fallbackResponse()为进入熔断功能时执行的逻辑
- */
- @Override
- public ClientHttpResponse fallbackResponse() {
- return new ClientHttpResponse() {
- @Override
- public HttpStatus getStatusCode() throws IOException {
- return HttpStatus.SERVICE_UNAVAILABLE;
- }
- @Override
- public int getRawStatusCode() throws IOException {
- return 503;
- }
- @Override
- public String getStatusText() throws IOException {
- return "Service_Fallbcak";
- }
- @Override
- public void close() {
- }
- @Override
- public InputStream getBody() throws IOException {
- return new ByteArrayInputStream("您好, 服务出现故障, 请重试.".getBytes("utf-8"));
- }
- @Override
- public HttpHeaders getHeaders() {
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return headers;
- }
- };
- }
- }
项目打包
在命令行工具中进入项目 pom 文件所在路径, 然后执行 mvn clean package 打包.
过程可参考: SpringCloud 从入门到进阶(二)-- 注册中心 Eureka
拷贝
使用 Bitvise SFTP 或 WinSCP 等工具将 jar 包上传到有公网的服务器, 再使用 scp 命令将 jar 包拷贝到路由接入服务器普通用户的~/jars 路径下.
过程可参考: SpringCloud 从入门到进阶(二)-- 注册中心 Eureka
修改 hosts 文件
将内部域名 eureka7001.com,eureka7002.com,eureka7003.com 绑定到局域网 IP 172.26.125.118, 将 gateway7081.com 绑定到局域网 IP 172.26.125.117. 并将微服务的主机名绑定到对应的局域网 IP(不加会出现无法路由的问题, 详见第 4 节).
修改 / etc/hosts, 添加 hostname 对应的 ip 地址
- #IP 域名 别名
- [jms@iz8vb62snc6e5cage5yvzcz 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
- 127.0.0.1 gateway7081.com
- # 不加会出现无法路由的问题, 详见系列文章第 (四) 节
- 172.26.125.113 iz8vb6a56ld0vy6vuaijriz
- 172.26.125.111 iz8vb6a56ld0vy6vuaijrjz
重启网卡
- [jms@iz8vb62snc6e5cage5yvzcz jars]$ sudo /etc/rc.d/init.d/network restart
- Restarting network (via systemctl): [ OK ]
进行 ping 测试
- [jms@iz8vb62snc6e5cage5yvzcz jars]$ ping eureka7001.com
- PING eureka7001.com (172.26.125.118) 56(84) bytes of data.
- 64 bytes from eureka7001.com (172.26.125.118): icmp_seq=1 ttl=64 time=0.143 ms
- 64 bytes from eureka7001.com (172.26.125.118): icmp_seq=2 ttl=64 time=0.149 ms
- [jms@iz8vb62snc6e5cage5yvzcz jars]$ ping gateway7081.com
- PING gateway7081.com (127.0.0.1) 56(84) bytes of data.
- 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.015 ms
- 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
- # 可见访问本机和访问局域网的网络延迟差 1 个数量级.
启动与测试
[jms@iz8vb62snc6e5cage5yvzcz jars]$ java -jar gateway-service-7081-7082-1.0-SNAPSHOT.jar --spring.profiles.active=peer1 &
访问 eureka 服务器
使用 postman 请求 API, 由于微服务还未部署, 因此请求对应接口会报 503 错误(服务熔断).
关闭
关闭 java 程序请参考: Linux 入门实践笔记(二)--Jar 包运行与关闭
来源: https://www.cnblogs.com/lonelyJay/p/9842061.html