您的位置:首页 > 编程语言 > Java开发

SpringCloud服务的注册与发现(Eureka)

2017-10-14 22:12 846 查看
- 服务治理的概念

服务治理是微服务架构中最为核心和基础的模块,主要用来实现各个微服务实列的自动化注册与发现。微服务实例可以是一个简单的SpringBoot程序

- 如何实现服务注册与服务发现

在程序中服务提供方需要显示的将服务注册到注册中心去。在注册登记中心登记在自己提供的服务,主机。端口号,版本号,通信协议等等。注册中心通过服务名进行管理,例如:



服务调用方通过服务名发起调用实现,调用方需要向服务注册中心咨询服务,并获取所有服务实例的清单,以实现对具体服务实例的访问,如果有多个服务可以选择的话,采取某种轮询策略(客户端负载平衡)取出一个位置进行调用。在调用服务的时候还会涉及缓存等。

- 服务治理框架的关键

服务治理框架的三大核心,服务调用方、服务提供方、服务注册中心。服务调用方及服务提供方都是围绕服务注册中心展开的

- 搭建服务注册中心

和搭建简单的SpringBoot项目差不多,不过需要在idea中勾选EurekaServer,加载SpringCloud的注册中心的依赖

pom.xml:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncod
4000
ing>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</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-web</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>


EurekaServerApplication启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}


加入了@EnableEurekaServer注解,启动

一个服务注册中心

application.properties配置类

server.port = 1111

eureka.instance.hostname = localhost
eureka.client.register-with-eureka = false
eureka.client.fetch-registry = false
eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka


server.port:本地测试的时候为了防止端口被占用改变端口号

eureka.client.register-with-eureka:代表不向注册中心注册自己,这个服务注册中心是单节点的服务中心,为了满足生产环境,需要使用构建高可用的服务注册中心

eureka.client.fetch-registry:代表不去检索服务,因为注册中心的主要作用是维护服务器实例

eureka.client.serviceUrl.defaultZon:注册中心的地址,服务器调用方和服务器提供方向里面请求、注册服务

完成以后,启动应用,访问http://localhost:1111/



因为此时没有服务注册中心注册服务,所以Instances currently registered with Eureka这一行内容为空

- 服务提供者

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.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-web</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>


和服务注册表的pom.xml类似,只不过将spring-cloud-starter-eureka-service改成了spring-cloud-starter-eureka

启动类

@EnableDiscoveryClient
@SpringBootApplication
public class ServiceproviderApplication {

public static void main(String[] args) {
SpringApplication.run(ServiceproviderApplication.class, args);
}
}
@EnableDiscoveryClient注解,激活DiscoveryClient实现

- 控制类

@EnableDiscoveryClient
@Controller
public class HelloController {

@Value("${server.port}")
private String port;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
@ResponseBody
public String sayHello() {

return "hello world I'am from " + port;
}
}


@EnableDiscoveryClient注解表明自己是一个服务提供方

application.properties

server.port=1112

spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/


spring.application.name:服务名

eureka.client.serviceUrl.defaultZone:向哪个注册中心注册服务

同时启动服务注册中心和服务提供方,访问http://localhost:1111/http://localhost:1112/hello

前者:



多了一个服务

后者将返回helloworld….



- 服务调用方

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
</properties>

<dependencies>
<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>

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

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


pom.xml中多了spring-cloud-starter-ribbon

启动类

@EnableDiscoveryClient
@SpringBootApplication
public class ServiceconsumerApplication {

@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}

public static void main(String[] args) {
SpringApplication.run(ServiceconsumerApplication.class, args);
}
}


@EnableDiscoveryClient:通过该注解让该应用注册为Eureka客户端的应用,以获得服务发现的能力

@Bean:创建RestTemplate实例,通过它发起对服务的调用

@LoadBalanced:开启客户端负载平衡

服务调用方控制类:

@Controller
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;

@RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
@ResponseBody
public String helloConsumer() {
return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
}
}


这里访问的地址是服务名个,而不是一个具体的地址,通过Ribbon实现负载平衡,选择一个服务地址

application.properties

spring.application.name=ribbon-consumer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/


此时再次访问http://localhost:1111将会发现有两个当前服务被注册了,访问http://localhost:9000/ribbon-consumer:



完整代码地址:https://github.com/TiantianUpup/SpringCloudEureka
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  架构 微服务