Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka、Consul、Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍Eureka的使用:
- 创建服务注册中心
- 创建服务提供者
- 创建服务消费者
- 服务消费
- 踩的坑
一、创建服务注册中心
1.创建一个基础SpringBoot工程,命名为eureka-server
2.修改pom.xml
(1)修改一:SpringCloud版本管理
<!-- 使用dependencyManagement进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
(2)修改二:添加Eureka Server 起步依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
(3)完整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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.zrk</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <description>Eureka Server</description> <!-- 使用dependencyManagement进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.修改主启动类
只需在主启动类上添加@EnableEurekaServer注解就可以启动一个服务注册中心:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
官方文档截图:
4.修改配置
修改配置文件,如application.properties,也可用application.yml(官方文档使用)等:
spring.application.name=eureka-server server.port=8761 eureka.instance.hostname=localhost #不把自己注册到注册中心 eureka.client.register-with-eureka=false #不去发现服务 eureka.client.fetch-registry=false #服务注册中心url eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
启动工程,访问http://localhost:8761
可以看到Eureka管理页面,看到No instances available,表示还没有实例注册到注册中心。
注:后续就会发现SpringCloud整合其他框架时都是先导入对应起步依赖,再添加对应注解,再修改配置。
更多详细配置可以参考EurekaInstanceConfigBean.java and EurekaClientConfigBean.java。
二、创建服务提供者
1.创建一个基础SpringBoot工程,命名为eureka-provider-user
2.修改pom.xml
(1)修改一:SpringCloud版本管理
<!-- 使用dependencyManagement进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
(2)修改二:添加Eureka起步依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
(3)完整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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.zrk</groupId> <artifactId>eureka-provider-user</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-provider-user</name> <description>Eureka Client</description> <!-- 使用dependencyManagement进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <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-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.修改主启动类
只需在主启动类上添加@EnableEurekaClient注解,也可使用@EnableDiscoveryClient注解,两个注解都能激活Eureka中的DiscoveryClient实现,只是前者仅限于使用Eureka的情况下使用。
@SpringBootApplication //@EnableEurekaClient @EnableDiscoveryClient public class EurekaProviderUserApplication { public static void main(String[] args) { SpringApplication.run(EurekaProviderUserApplication.class, args); } }
4.修改配置
spring.application.name=provider-user server.port=8081
#设置服务注册中心的URL
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
启动该工程,访问http://localhost:8761
可以看到provider-user服务已经注册成功!
5.添加业务逻辑
(1)UserController.java
@RestController
@RequestMapping("user")
public class UserController
{
@RequestMapping(value = "getUserById/{id}")
public User getUser(@PathVariable Integer id){
User user = new User();
user.setId(id);
user.setName("张三");
user.setPassword("123");
return user;
}
}
(2)User.java
public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
三、创建服务消费者
1.创建一个基础SpringBoot工程,命名为eureka-consumer-basketball
2.修改pom.xml
(1)修改同eureka-provider-user,只是多了web相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2)完整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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zrk</groupId>
<artifactId>eureka-consumer-basketball</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-consumer-basketball</name>
<description>Eureka Client</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.修改主启动类
在主启动类上添加@EnableDiscoveryClient注解,并添加RestTemplate组件
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerBasketballApplication {
@Bean(name = "restTemplate")
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerBasketballApplication.class, args);
}
}
4.修改配置
spring.application.name=consumer-basketball
server.port=8082
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
5.添加业务逻辑
(1)BasketballController.java
@RestController public class BasketballController { @Resource private RestTemplate restTemplate; @RequestMapping(value = "getUser/{id}") public User getUserById(@PathVariable Integer id){ return this.restTemplate.getForObject("http://provider-user/user/getUserById/" + id,User.class); } }
(2)User.java
public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
启动该工程,访问http://localhost:8761
可以看到consumer-basketball服务已经注册成功!
四、服务消费
浏览器访问http://localhost:8082/getUser/1
报了 java.net.UnknownHostException: provider-user异常,发现通过provider-user服务名直接访问不可以,查询后需要加@loadBalance注解才能用服务名访问,调整如下:
(1)修改一:添加ribbon依赖
<!-- ribbon ,实现客户端负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
(2)修改二:加@loadBalance
重启工程,再次访问http://localhost:8082/getUser/1
访问成功!
五、踩的坑
1、网速慢下载maven很慢
在网速慢的情况下下载maven依赖特别慢,可以通过修改setting.xml解决
参考链接:https://www.cnblogs.com/zrk3/p/maven_speed_up.html
2、版本兼容问题
SpringCloud跟SpringBoot存在版本兼容问题,导致启动报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder
参考链接:https://www.cnblogs.com/zrk3/p/10405989.html
3、服务名访问问题
消费者通过生产者服务的服务名进行访问时报 java.net.UnknownHostException异常。
参考链接:https://blog.csdn.net/qq_18416057/article/details/79432504