SpringCloud 学习(二) :服务注册与发现Eureka

Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka、Consul、Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍Eureka的使用:

  • 创建服务注册中心
  • 创建服务提供者
  • 创建服务消费者
  • 服务消费
  • 踩的坑

一、创建服务注册中心

1.创建一个基础SpringBoot工程,命名为eureka-server

SpringCloud 学习(二) :服务注册与发现Eureka

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);
}
}

官方文档截图SpringCloud 学习(二) :服务注册与发现Eureka

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

SpringCloud 学习(二) :服务注册与发现Eureka

可以看到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

SpringCloud 学习(二) :服务注册与发现Eureka

可以看到provider-user服务已经注册成功!

5.添加业务逻辑

SpringCloud 学习(二) :服务注册与发现Eureka

(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.添加业务逻辑

SpringCloud 学习(二) :服务注册与发现Eureka

(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

SpringCloud 学习(二) :服务注册与发现Eureka

可以看到consumer-basketball服务已经注册成功!

四、服务消费

浏览器访问http://localhost:8082/getUser/1

SpringCloud 学习(二) :服务注册与发现Eureka

报了 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

SpringCloud 学习(二) :服务注册与发现Eureka

重启工程,再次访问http://localhost:8082/getUser/1

SpringCloud 学习(二) :服务注册与发现Eureka

访问成功!

五、踩的坑

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

上一篇:phpWeb


下一篇:使用moy快速开发后台管理系统(一)