前言
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式 会话,集群状态)。 ,并且使用Spring Cloud开发人员可以快速实现这些模式的服务和应用程序。 他们将在任何分布式环境中工作良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。
Eureka 服务发现:其他可以服务可以向Eureka注册实例,客户端可以使用Spring管理的bean来发现实例,相同技术有Dubbo, zookeeper
Eureka架构图预览(图中Registry 注册中心位置)
使用Eureka完成服务发现步骤讲解
新建spring-cloud-eureka-server 工程(服务发现)
pox.xml 添加eureka-server依赖 ,并添加 docker-maven-plugin ,可以通过 mvn clean package docker:build 直接打包成执行镜像,配置如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${artifactId}-${version}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- defined in spring-cloud-starter-parent pom (as documentation hint),
but needs to be repeated here -->
<configuration>
<mainClass>bhz.springcloud.EurekaApplication</mainClass>
<requiresUnpack>
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-core</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
</plugins>
</build>
功能配置文件application.yml euraka相关配置如下
spring:
application:
name: eureka
profiles:
active: dev
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
server:
port: 8003
解释 name:访问服务中心名称
defaultZone: 其他服务注册到服务中心路径
prot : 访问服务中心路径
编写类,开启服务中心配置
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
新建spring-cloud-provider工程(服务注册) 端口7001
pom.xml 添加eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
application.yml 配置
provider-service :服务名称
defaultZone: 注册服务到配置中心地址
spring:
application:
name: provider-service
server:
port: 7001
context-path: /
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8001/eureka/
启动类ProviderApplication , EnableDiscoveryClient注解开启服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
@RestController
public class IndexController {
@RequestMapping(value = "/hello")
public String hellow(){
return "hello word " ;
}
}
新建 spring-cloud-consumer工程(服务调用) 端口7002
pom.xml 添加 eureka,ribbon依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
server:
context-path: /
port: 7002
spring:
application:
name: consumer-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8001/eureka/
添加ProviderApplication , EnableDiscoveryClient注解开启服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
};
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@RestController
public class HelloController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "getway")
public String getWay(){
ResponseEntity<String> result=restTemplate.getForEntity("http://provider-service/hello",String.class);
System.err.println("------------ "+ result + "--------------------");
return "调用成功";
}
@RequestMapping(value = "geturl")
public String getUrl(){
RestTemplate urlTemplate=new RestTemplate();
ResponseEntity<String> result=urlTemplate.getForEntity("http://localhost:7001/hello",String.class);
System.err.println("------------ "+ result + "--------------------");
return "调用成功";
}
}
说明:
方法getway() 是通过服务中心管道调用服务,无需指定ip和端口,交由服务中心转发
方法getUrl 是通过原生http请求调用接口,没有走服务中心通道
访问服务发现地址 localhost:8001 , 调用接口地址: http://localhost:7002/getway
说明:
application中 三个工程 eureka-server, provider-server , consumer-server 已经注册到配置中心 ,并统一交由配置中心管理服务,
内部可自由调用服务, 为接下来的 负载均衡,网关,断路器,等等...做准备