服务注册与发现
本例代码详见 cloudDemo01 。
一、创建“服务注册中心”
####### 1、创建一个基础的Spring Boot工程,并在pom.xml中引入需要的依赖内容:详细配置见示例。
cloudDemo01
com.learn
1.0-SNAPSHOT
4.0.0
com.learn
eureka-server
0.0.1-SNAPSHOT
jar
eurekaserver
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud-dependencies.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
${spring-boot.version}
2、通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。这一步非常的简单,只需要在一个普通的Spring Boot应用中添加这个注解就能开启此功能。
package com.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringCloudApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3、修改 application.yml 文件,在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.properties中问增加如下配置:
server:
port: 8091
eureka:
instance:
hostname: 127.0.0.1
client:
registerWithEureka: false
fetchRegistry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
4、启动工程,访问 http://localhost:8091/
二、创建“服务提供方” (eureka client)
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
1、创建一个基本的springboot项目 task-server 。修改pom文件
cloudDemo01
com.learn
1.0-SNAPSHOT
4.0.0
com.learn
service-rest
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud-dependencies.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
${spring-boot.version}
2、注解@EnableEurekaClient 表明自己是一个eurekaclient
package com.service.rest;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringCloudApplication
@EnableEurekaClient
public class RestApplication {
public static void main(String[] args) {
SpringApplication.run(RestApplication.class, args);
}
}
3、配置文件中注明自己的服务注册中心的地址,application.yml配置文件如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8091/eureka/
server:
port: 8092
spring:
application:
name: rest-service
- 需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
- eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置。
4、添加一个controller类
package com.service.rest;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringCloudApplication
@EnableEurekaClient
public class RestApplication {
public static void main(String[] args) {
SpringApplication.run(RestApplication.class, args);
}
}
5、再次访问 http://localhost:8091/、以及 http://localhost:8092/test/adas ,查看内容。
三、安全验证
注册中心的管理界面以及服务注册时,没有任何认证机制,安全性比较差,如果其它服务恶意注册一个同名服务,但是实现不同,可能就有风险了,可以参考下面的配置改进:
1、引入spring-boot-starter-security jar包。
org.springframework.boot
spring-boot-starter-security
1.4.2.RELEASE
2、在eureka server的application.yml中增加:
security:
basic:
enabled: true
user:
name: xx
password: xx123
这样就添加了1个用户名及密码(注:其原理就是spring-security,熟悉spring-security的朋友,也可以改成把用户名/密码存储在数据库中)。
启动后,再浏览eureka server就用输入用户名,密码了。
3、其它服务注册时,相应的defautZone也要改成类似:
eureka:
client:
serviceUrl:
defaultZone: http://xx:xx123@localhost:8091/eureka/
四、spring cloud配置注册中心显示服务的ip地址和端口,在服务提供方的配置文件中添加如下配置
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}
eureka.instance.prefer-ip-address=true