1.创建一个maven项目cloud-eureka-server,在pom中引入eureka:
<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.wyh</groupId>
<artifactId>cloud-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId><!-- 加上server的说明是服务端,不加server的是客户端 -->
</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>
</project>
在main/resources下创建application.properties:
#eureka的默认端口号是8761
server.port=8761
#显示在eureka注册中性能的应用名称
spring.application.name=eureka-server
#是否注册到eureka,服务端自己不需要注册
eureka.client.register-with-eureka=false
#是否从eureka获取注册信息
eureka.client.fetch-registry=false
#服务名称
eureka.instance.hostname=server.eureka
#eureka自我保护机制
eureka.server.enable-self-preservation=false
创建启动类:
package com.wyh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer//开启eureka服务端
@SpringBootApplication
public class TestApplicatioon {
public static void main(String[] args) {
SpringApplication.run(TestApplicatioon.class, args);
}
}
2.创建服务提供者:maven项目cloud-eureka-provider:
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.wyh</groupId>
<artifactId>cloud-eureka-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId><!-- 没有加server后缀的表示是客户端 -->
</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>
</project>
application.properties:
server.port=9081
spring.application.name=eureka-provider
#是否注册到eureka中,默认是true
eureka.client.register-with-eureka=true
controller:
package com.wyh.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping(value = "/find/{id}")
public String find(@PathVariable("id") String id) {
String s = id + "用户访问";
return s;
}
}
启动类:
package com.wyh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient//客户端
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
3.创建eureka服务消费者,maven项目cloud-eureka-consumer:
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.wyh</groupId>
<artifactId>cloud-eureka-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- springboot实现java web服务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
</project>
application.proerpties:
server.port=9082
spring.application.name=eureka-consumer
使用RESTful api风格访问,创建RestTemplate:
package com.wyh.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration//相当于applicationContext.xml中定义的bean
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
controller:
package com.wyh.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
//调用服务提供者的链接前缀,即eureka-provider中定义的端口号
private static final String REST_URL_PREFIX = "http://localhost:9081";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getUser/{id}")
public String find(@PathVariable("id") String id) {
//使用restTemplate调用服务提供者
return restTemplate.getForObject(REST_URL_PREFIX+"/user/find/"+id, String.class);//参数一拼接为服务提供者中controller的访问链接,参数二是返回类型
}
}
启动类:
package com.wyh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient//客户端(服务提供者和消费者都是客户端)
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
项目建完之后,先启动eureka服务(cloud-eureka-server) run as springboot app:
访问8761端口号查看eureka服务中心:
启动服务提供者(cloud-eureka-provider):
访问的端口号是9081。服务提供者启动成功后,先去8761端口号中访问一下eureka中是否把服务提供者注册进去了:
说明服务提供者已注册到eureka中。然后我们访问一下服务提供者的controller:
这里的id在controller中没有实际意义,是随便传的值。实际业务中做具体处理。
访问成功,说明服务提供者可以正常访问,然后启动服务消费者:
先去eureka注册中心看一下此时的变化:
注册中心多了一个服务消费者,说明服务已经注册成功。此时按照consumer中的controller链接去访问,看是不是能正常访问到服务提供者中的内容:
说明服务消费者能够调用到服务提供者,至此微服务之间的简单调用也就实现了。
eureka中参数配置的默认值(https://www.jianshu.com/p/8f4903be43a4):
在上面的服务实现时,遇到了一个疑问:服务提供者和服务消费者与服务中心是不同的project,他们并没有直接联系,为什么服务提供者和消费者启动之后,8761中就能注册到提供者和消费者?
答:在参数中有一个属性:eureka.client.register-with-eureka的默认值是true,也就是说在你不写这个属性的时候,由于你在项目中引入了eureka,那么就会默认把服务注册熬eureka中。如果把这个属性改为false,启动提供者和消费者后,8761中就不会看到这两个服务,就说明不会注册。
无论服务是否注册到eureka中,都不会影响消费者调用生产者,因为他们两个的调用是通过http直接调用的,就像我们直接在浏览器中直接通过http去请求服务一样。
另一个疑问是,既然服务不需要注册就可以直接调用,那么为什么还要有注册中心?
答:因为当服务的调用者和消费者越来越多,各个服务之间的联系越来越复杂,当某个服务出现故障或对某个服务进行扩展时就会产生很多连锁影响,而使用注册中心之后,就方便了对服务之间的管理,一目了然,不会使服务显得错综复杂。(https://www.imooc.com/article/details/id/25364)