SpringCloud 之 Eureka (二)

一、Eureka简介

       Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一。用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

       简而言之,就是服务的注册与发现,类似于 Dubbo 的注册中心,比如 Zookeeper。

二、Eureka创建注册中心(注册中心)

    1.创建Spring Boot 项目 eureka-register-service  

       可以手动创建,也可以快捷生成SpringBoot项目:https://start.spring.io/

    2.pom.xml中添加依赖( 依赖可到http://mvnrepository.com/中自行查找 )

<!-- Eureka服务端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Brixton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

     3.新建配置文件application.yml,配置相关参数

server:
    port: 9000
    
eureka:
    instance:
        hostname: localhost   # eureka 实例名称
    client:
        register-with-eureka: false # 不向注册中心注册自己
        fetch-registry: false       # 是否检索服务
        service-url:
            defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # 注册中心访问地址

     4.启动类添加注解@EnableEurekaServer,开启注册中心功能

@EnableEurekaServer
@SpringBootApplication
public class SpringCloudApplication {

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

}

     5.访问 http://localhost:9000 ,查看 Eureka 服务监控界面

    由于此时还没有服务注册,因此没有服务信息 No instances available。 

三、Eureka注册服务(服务提供)

    1.创建Spring Boot 项目 eureka-provider

    2.pom.xml中添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka 客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

    3. 新建配置文件application.yml,配置相关参数

server:
    port: 8081
 
spring:
    application:
        name: eureka_provider

eureka:
    instance:
        instance-id: eureka_provider-8081
        prefer-ip-address: true # 访问路径可以显示 IP
    client:
        service-url:
            defaultZone: http://localhost:9000/eureka/  # 注册中心访问地址

    4.提供接口供消费者端调用,业务逻辑在此实现

@RestController
@RequestMapping("/provider/user")
public class UserController {
	@Autowired
	private UserService userService;

	@RequestMapping("/get/{id}")
	public User get(@PathVariable("id") Integer id) {
		return this.userService.getById(id);
	}
}

    5.启动类添加注解@EnableEurekaClient(注意跟@EnableEurekaServer的区别)

@EnableEurekaClient
@SpringBootApplication
public class SpringCloudProviderApplication {

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

    6. 仍然访问 http://localhost:9000 ,查看 Eureka 服务监控界面

 此时有服务注册进来,不再显示No instances available,应用名自动显示为大写。

四、Eureka发现服务(服务消费)

    1.创建Spring Boot 项目 eureka-consumer

    2.pom.xml中添加依赖

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

    3.新建配置文件application.yml,配置相关参数

server:
    port: 80
 
spring:
    application:
        name: eureka_consumer

eureka:
    client:
        register-with-eureka: false # 不向注册中心注册自己
        fetch-registry: true        # 是否检索服务
        service-url:
            defaultZone: http://localhost:9000/eureka/  # 注册中心访问地址

    4.业务相关类 获取注册的服务(调用eureka_provider中接口)

public class User{

	private int id;
	private String userName;
	private String password;
	
	
	public User() {
		super();
	}

	public User(int id, String userName, String password) {
		super();
		this.id = id;
		this.userName = userName;
		this.password = password;
	}
	
	//get set 方法略
	
}
@RestController
@RequestMapping("/user")
public class UserController {
	private static final Log log = LogFactory.getLog(UserController.class);
	
	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private DiscoveryClient client;

	@RequestMapping("get/{id}")
	public User get(@PathVariable("id") Integer id) throws Exception {
		List<ServiceInstance> list = this.client.getInstances("EUREKA_PROVIDER");
		String uri = "";
	    for (ServiceInstance instance : list) {
	        if (instance.getUri() != null && !"".equals(instance.getUri())) {
	        	uri = instance.getUri().toString();
	        	break;
	        }
	    }
	    log.info("获取到的服务uri = " + uri);
		return restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class);
	}
}

    5.启动类添加注解@EnableDiscoveryClient

@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudConsumerApplication {
	
	@Bean
	public RestTemplate restTemplate(RestTemplateBuilder builder){
		return builder.build();
	}
	
	public static void main(String[] args) {
		SpringApplication.run(SpringCloudConsumerApplication.class, args);
	}
}

     6.访问地址http://localhost/user/get/1,查看调用服务接口结果

五、注意事项

    1.pom.xml中添加依赖时,注意Spring Cloud与Spring Boot版本匹配关系

Spring Cloud Spring Boot
Finchley 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x
Dalston和Edgware 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x
Camden 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x
Brixton 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x
Angel 兼容Spring Boot 1.2.x

    2.如果开发工具是eclipse,那么要注意application.yml配置文件不要用Tab键来缩进,因为会导致spring读取yml配置文件异常。老老实实的按空格好了。

    3.直接注入RestTemplate没用,需要RestTemplateBuilder构建。

	@Bean
	public RestTemplate restTemplate(RestTemplateBuilder builder){
		return builder.build();
	}

    4.restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class);注意User中一定要有无参构造,否则会报错如下:

    5.@EnableEurekaClient & @EnableDiscoveryClient

     两者用法基本一致,都用来服务发现。

     如果注册中心是eureka,推荐使用@EnableEurekaClient,如果是其他注册中心,则推荐使用@EnableDiscoveryClient。 

猜你喜欢

转载自blog.csdn.net/zzz127333092/article/details/81744188