Eureka用于服务注册与发现,由两个组件组成:Eureka服务端和Eureka客户端。

一、Eureka服务端的配置

1.1 所需依赖

只需要这两个就行了

security是安全框架

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-security</artifactId>
  8. </dependency>

1.2 application.properties配置文件

# 端口
server.port=10000
# 应用别名
spring.application.name=eureka-server
# 因为当前的eureka是单机的 所以需要做一些配置
# eureka服务的ip地址 这里是在本机做测试
eureka.instance.hostname=localhost
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://user:123@${eureka.instance.hostname}:${server.port}/eureka/
# 管理页面的账号密码 spring boot2.x版本后的写法
spring.security.user.name=user
spring.security.user.password=123

但使用spring boot2.x的话直接写http://user:123@${eureka.instance.hostname}:${server.port}/eureka/是无法注册的,需要写一个spring security的配置类禁用security的csrf才可以在eureka上注册

@Configuration
@EnableWebSecurity
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 禁用security的csrf
     *
     * @param http HttpSecurity
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.csrf().disable();
    }
}

1.3 启动类

@EnableEurekaServer注解表示此项目为eureka的服务端

@SpringBootApplication
@EnableEurekaServer
public class EurekaApp {

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

}

以上全都准备好之后运行项目,输入http://ip:端口就可以访问eureka管理页面

二、eureka客户端

在最简单的微服务程序中的“生产者”和“消费者”都可以称得上是客户端,需要注册到eureka中

2.1 所需依赖

eureka客户端的依赖就这么一个

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2.2 application.properties配置文件

以消费者项目为例要注册到eureka服务中

user:123是eureka服务端设置的账号和密码

spring.application.name设置应用的别名 可以和别的项目重名 重名用于高可用

# 端口
server.port=8900
# 应用别名
spring.application.name=consumer
eureka.client.service-url.defaultZone=http://user:123@localhost:10000/eureka

2.3 服务调用

在消费者端调用生产者的接口现在就可以将代码改写了

首先要写一个配置类配置要用到的RestTemplate类

@Configuration
public class RestTemplateConfig {

    /**
     * 配置注入restTemplate
     * @param builder Spring提供的RestTemplateBuilder
     * @return restTemplate对象
     */
    @Bean
    public RestTemplate getRestTemplate(RestTemplateBuilder builder){
        return builder.build();
    }

}

然后在controller类中调用生产者的接口

“PROVIDER”为生产者项目的应用别名

@RestController
public class OrderController {

    @Autowired
    private EurekaClient eurekaClient;

    /**
     * spring提供的一个用于访问rest接口的对象
     */
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/{id}")
    public User getOrder(@PathVariable Integer id) {
        //找提供者
        InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER", false);
        String url = instanceInfo.getHomePageUrl();
        return restTemplate.getForObject(url + "/user/" + id, User.class);
    }

}