有空学习了一下SpringCloud,根据大神(这篇很详细,都是干货点击打开链接)的经验自己实际操作了一下,依然踩了很多坑,所以总结一下,以免忘记。
1.SpringCloud简介
spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。结合springboot 做微服务架构开发,是目前很火的架构,简单方便。
2.Eureka
eureka是一个服务注册和发现模块。包括Eureka Server和Eureka Client,客户端注册服务到服务端,这样就能发现并监测。
3.Eureka Server 服务搭建
3.1 新建一个springboot项目(maven项目,打jar包) eurekaserver,pom文件如下:
<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.yuanyuan</groupId> <artifactId>eurekaserver</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eurekaserver</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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> <dependencies> <!--eureka server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- spring boot test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
tips:
(1)springboot版本最好用1.5.2.RELEASE,版本太新会出现各种问题,已踩过坑。
(2)对应springcloud版本Dalston.RELEASE,我之前参考大神的用Dalston.RC1发现找不到类,注解@EnableEurekaServer无法引入,改了版本之后一切正常。
3.2 springboot启动类如下:
@EnableEurekaServer @SpringBootApplication public class EurekaserverApplication { public static void main( String[] args ) { SpringApplication.run(EurekaserverApplication.class, args); } }
3.3 eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。
eureka server的配置文件appication.yml:
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server而不是eureka client
3.4 启动项目,访问http://localhost:8761/,可以看到Eureka的主页面,这个时候没有服务注册,所以也没有服务被发现。
到这里,eureka server就成功了,下面再搭建eureka client .
4. eureka client 搭建
<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.yuanyuan</groupId> <artifactId>eurekaclient</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eurekaclient</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </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> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
4.2 pringboot启动类如下:
package com.yuanyuan.eurekaclient; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * Hello world! * */ @RestController @SpringBootApplication @EnableEurekaClient public class EurekaclientApplication { public static void main( String[] args ) { SpringApplication.run(EurekaclientApplication.class, args); } @Value("${server.port}") //读取配置文件中的Port String port; @RequestMapping("/hi") public String sayHi(@RequestParam String name) { return "hi" + name + ",my port is:" + port; } }
4.3 application.yml :
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: service-hi
除了@EnableEurekaClient 注解,还需要在配置文件中指定自己的服务注册中心的地址。
tips:
application name 是一个很重要的属性,这个指定了当前服务的名称,通过这个的名称可以找到对应的服务,因此该名称需要在整个项目中是唯一可识别的。
4.4 启动项目,访问http://localhost:8762/hi?name=yuanyuan 可以看到:
到这eureka client搭建成功,再次刷新server(http://localhost:8761/)如下:
这时候已经有一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为8762