一、搭建eureka-server
1. 创建eureka-server服务
①创建eureka-server模块
②配置pom.xml(eureka-server)
XML
<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>com.situ.demo</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0</version>
</parent>
<groupId>com.situ.eureka</groupId>
<artifactId>eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
③创建EurekaApplication.java
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
④创建配置eureka-server模块的application.yml
java
server:
port: 8082
⑤运行EurekaApplication.java
⑥项目结构:

2. 引入eureka依赖pom(eureka-server)
XML
<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">
...
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3. 编写启动类EurekaApplication.java
java
...
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
...
@EnableEurekaServer
public class EurekaApplication {
...
}
4. 编写启动eureka-server模块的文件application.yml
java
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
5. 启动服务


二、服务注册
1. 引入依赖pom.xml(user-service)
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">
...
<dependencies>
...
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
...
</project>
2. 配置文件user-service模块的application.yml
XML
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://192.168.17.128:3306/cloud_user?useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.jdbc.Driver
application:
name: userservice
mybatis:
type-aliases-package: com.situ.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.situ: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
3. 启动多个user-service实例






三、服务发现
1. 引入依赖pom.xml(order-servie)
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">
...
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
...
</project>
2. 配置文件order-service模块的application.yml
XML
server:
port: 8080
spring:
...
application:
name: orderservice
...
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
3. 服务拉取和负载均衡
修改OrderService.java
java
@Service
public class OrderService {
...
public Order queryOrderById(Long orderId) {
...
String url = "http://userservice/user/" + order.getUserId();
...
}
}
重运行OrderApplication,清空UserApplication、UserApplication2控制台,在OrderService类中,通过String url = "http://userservice/user/" + order.getUserId();发起的 HTTP 请求,会基于Spring Cloud Netflix Eureka的服务发现机制,自动从Eureka注册中心所维护的服务实例列表里,查找服务名为userservice的可用实例(即UserApplication和UserApplication2对应的服务实例)。Eureka 会按照其内置的负载均衡策略(默认是轮询策略),为该请求分配userservice下的某一个具体服务实例,进而实现对该实例所提供的getUserId()相关功能接口的调用。

Q:java.net.UnknownHostException: userservice表明OrderApplication无法通过服务名userservice找到对应的服务实例
A: 为getRestTemplate()方法添加@LoadBalanced注解,重运行OrderApplication.java
java
...
public class OrderApplication {
...
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
...
}
}
刷新localhost:8080/order/101,通过控制台输出查看调用情况




