环境说明:spring boot2.0 + jdk1.8
第一步:搭建eureka server,创建一个maven项目,也可以直接idea或者 https://start.spring.io/ 快速创建 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>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hht</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
</project>
启动类
package com.hht.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
配置文件
spring.application.name=spring-cloud-eureka-server
server.port=12345
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=\
http://localhost:${server.port}/eureka
注意单节点情况:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
启动成功后 访问 http://localhost:12345/
第二步,搭建eureka client端部分,包括服务注册、发现和使用,整体结构如下图
user-api模块用来定义接口
package com.hht.user.domain;
/**
* @author hht
* @ClassName User
* @Description TODO
* @Date 2019/4/30 15:50
* @VERSION 1.0
*/
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.hht.user.service;
import com.hht.user.domain.User;
import org.springframework.stereotype.Service;
import java.util.Collection;
public interface UserService {
/**
* 保存用户
*
* @param user
* @return 如果保存成功的话,返回<code>true</code>,
* 否则返回<code>false</code>
*/
boolean save(User user);
/**
* 查询所有的用户对象
*
* @return 不会返回<code>null</code>
*/
Collection<User> findAll();
}
user-service-consumer模块用来模拟服务发现和使用
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>eureka-client</artifactId>
<groupId>com.hht</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service-consumer</artifactId>
<dependencies>
<dependency>
<groupId>com.hht</groupId>
<artifactId>user-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
# 应用名称
spring.application.name=user-service-client
server.port=8080
# Eureka 服务器地址
eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=192.168.1.160
@SpringBootApplication
@EnableDiscoveryClient
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class,args);
}
}
实现接口类,通过restTemplate(实验,一般生产环境有替代方案)
package com.hht.service;
import com.hht.user.domain.User;
import com.hht.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.Collection;
/**
* @author hht
* @ClassName com.hht.service.UserServiceProxy
* @Description TODO
* @Date 2019/4/30 16:16
* @VERSION 1.0
*/
@Service
public class UserServiceProxy implements UserService {
private static final String PROVIDER_SERVER_URL_PREFIX = "http://user-service-provider";
/**
* 通过 REST API 代理到服务器提供者
*/
@Autowired
private RestTemplate restTemplate;
@Override
public boolean save(User user) {
User returnValue =
restTemplate.postForObject(PROVIDER_SERVER_URL_PREFIX + "/user/save", user, User.class);
return returnValue != null;
}
@Override
public Collection<User> findAll() {
return restTemplate.getForObject(PROVIDER_SERVER_URL_PREFIX + "/user/list", Collection.class);
}
}
user-service-provider模块用来模拟服务提供方
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>eureka-client</artifactId>
<groupId>com.hht</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-provider</artifactId>
<dependencies>
<dependency>
<groupId>com.hht</groupId>
<artifactId>user-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
# 应用名称
spring.application.name=user-service-provider
# Eureka Client 端口
server.port=8081
# Eureka 服务器地址
eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=192.168.1.160
接口实现类,业务的真实逻辑
package com.hht.service;
import com.hht.respository.UserRespository;
import com.hht.user.domain.User;
import com.hht.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRespository respository;
@Override
public boolean save(User user) {
return respository.save(user);
}
@Override
public Collection<User> findAll() {
return respository.findAll();
}
}
到此结束:整体逻辑为,两个client 都注册到了 server端,通过访问服务名字+方法调用另一个服务 附加:一般生产环境需要高可用 只要修改eureka server的配置文件,启动多个即可
eureka.client.register-with-eureka=false #去掉
eureka.client.fetch-registry=false #去掉
eureka.client.service-url.defaultZone=\ #填写除自己外的,其它server节点地址
http://localhost:${server.port}/eureka
测试代码地址:https://gitee.com/huhaitao/spring_cloud_test/tree/master/eureka