springboot有集成eureka,可直接引入jar包,设置相应注解,就可以使项目变为eureka服务器
真正的EurekaServer是Netflix公司的开源项目,也是可以单独下载使用的。
pom.xml中加入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
写入配置:
server.port=8761
#服务器主机名
eureka.instance.hostname=localhost
#是否注册自身
eureka.client.register-with-eureka=false
#是否从eureka服务器获取注册信息
eureka.client.fetch-registry=false
#eureka服务器地址
eureka.client.service-url=http://${eureka.instance.hostname}:${server.port}/eureka/
在启动类上加上注解@EnableEurekaServer:
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
到此注册中心配置完毕
启动SpringCloudEurekaApplication ,访问 http://localhost:8761/可以看到Eureka的页面,从红框的位置可以看到没有任务服务实例注册到当前的服务注册中心
2.服务提供方
每一个实例注册之后需要向注册中心发送心跳,当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
新建一个springboot项目,springCloudEurekaClient,pom如下:
<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>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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>
想要实现一个服务提供方也很简单,只要在项目的启动类SpringCloudEurekaClientApplication上使用@EnableEurekaClient注解即可
@EnableEurekaClient
@SpringBootApplication
public class SpringCloudEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaClientApplication.class, args);
}
}
在application.properties中进行如下配置
server.port=8089
spring.application.name=rabbitSend
eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/
通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。
eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置。
使用server.port属性设置不同的端口。
启动SpringCloudEurekaClientApplication类
刷新 http://localhost:8761/,可以看到咱们的服务提供方已经注册到了服务注册中心
在新建一个HelloController
使用discoveryClient.getServices()获取已经注册的服务名。
@RestController
public class HelloController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/hello")
public String hello(String context){
String services = "Services: " + discoveryClient.getServices()+" ip :"+8089;
return services;
}
}
访问:http://localhost:8089/hello
最后说明一下@EnableEurekaClient 与@EnableDiscoveryClient这两个注解
首先这个两个注解都可以实现服务发现的功能,在spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等)
@EnableEurekaClient基于spring-cloud-netflix。服务采用eureka作为注册中心,使用场景较为单一。
@EnableDiscoveryClient基于spring-cloud-commons。服务可以采用其他注册中心。
3.服务消费者
springcloud服务调用方式有两种实现方式:
1,restTemplate+ribbon,
2,feign
本章先讲 restTemplate+ribbon,
ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。
Feign默认集成了ribbon。
实现过程
新一个springboot项目,名字为 springCloudEurekaConsumer
其pom.xml配置如下
<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>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-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>
在项目启动类Application上添加@EnableDiscoveryClient注解向服务中心注册服务,
并且使用@bean像spring容器中注入一个restTemplate对象,@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudEurekaConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaConsumerApplication.class, args);
}
}
在application.properties中指定,服务名:eureka-consumer-ribbon,端口为9101,服务注册中心地址为:http://localhost:8762/eureka/
spring.application.name=eureka-consumer-ribbon
server.port=9101
eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/
新建一个RibbonController类,用来消费eureka-client的服务
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/consumer")
public String getMsg() {
return restTemplate.getForObject("http://rabbitSend/hello", String.class);
}
}
这里的请求地址使用http://server-name,来代替http://ip:port,因为在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,这里请求的是rabbitSend/hello
使用之前已经创建的项目springCloudEureka,springCloudEurekaClient这俩项目
首先:
1,启动 springCloudEureka
2,启动 springCloudEurekaClient 配置文件的端口默认为8089
3,修改配置文件的端口为8088,再启动一个springCloudEurekaClient
4,在启动 eureka-consumer-ribbon
访问http://localhost:8761/,就会发现,已经有rabbitSend服务注册了,而且有两个实例,8088和8089
访问 http://localhost:9101/consumer,就会发现已经消费了 eureka-client项目提供的服务,而且ribbon已经默认实现了负载均衡
参考文献:
陈明羽:http://www.cnblogs.com/cmyxn/p/7704319.html
陈明羽:http://www.cnblogs.com/cmyxn/p/7704687.html
翟永超:http://blog.didispace.com/spring-cloud-starter-dalston-1/
方志鹏:http://blog.csdn.net/forezp/article/details/70148833#t0