内容
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从入门到进阶(三)——路由接入Zuul
参考
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 域名 别名 [[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 127.0.0.1 gateway7081.com #不加会出现无法路由的问题,详见系列文章第(四)节 172.26.125.113 iz8vb6a56ld0vy6vuaijriz 172.26.125.111 iz8vb6a56ld0vy6vuaijrjz
重启网卡
[[email protected] jars]$ sudo /etc/rc.d/init.d/network restart Restarting network (via systemctl): [ OK ]
进行ping测试
[[email protected] 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 [[email protected] 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个数量级。
启动与测试
[[email protected] 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