注册中心在微服务架构中是必不可少的一部分,主要用来实现服务治理功能。

注册中心带来的好处是你不需要知道有多少提供方,你只需要关注注册中心有多少服务即可。

1.Eureka

Spring Cloud Eureka是Spring Cloud Netflix微服务套件的一部分,主要实现服务治理功能。

2.使用Eureka编写注册中心服务

创建一个maven项目fangjia-eureka,需要这些依赖:spring boot,eureka,spring cloud,代码如下:

<!-- Spring  Boot -->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath />
    </parent>

<!-- eureka-->
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

<!-- Spring Cloud-->
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
在启动类上加上@EnableEurekaServer,开启Eureka Server

接着在application.properties属性文件增加以下配置:

spring.application.name=fangjia-euraka
server.port=8761
eureka.instance.hostname=localhost
#自己就是注册中心,所以别注册自己
eureka.client.register-with-eureka=false
#注册中心职责是维护服务实例,不需要检索服务
eureka.client.fetch-registry=false

3.编写服务提供者

3.1 创建项目注册到Eureka

注册中心建好并启动后,接下来将一个服务提供者fangjia-fsh-house-service注册到Eureka中,并提供一个接口给其他服务调用。

还是创建maven项目,写上相关依赖:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath />
    </parent>


    <dependencies>
<!--注意这里跟注册中心server是不一样的-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    <dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
在启动类上加入@EnableDiscoveryClient,表示当前服务是一个Eureka的客户端。

接下来创建一个application.properties文件(创建springboot项目时直接包含的,接下来不在说创建,直接用),添加配置:

spring.application.name=fsh-house
server.port=8081

#注册到注册中心去
eureka.client.service-url.defaul-zone=http://localhost:8761/eureka
启动服务,打开Eureka的Web控制台,就可以看到新注册的服务信息了。

3.2 编写提供接口

创建一个Controller,提供一个接口给其他服务查询:

@RestController
@RequestMapping("/house")
public class HouseController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
这时通过访问localhost:8081/house/hello,如果能看到返回的hello字符串,证明接口提供成功了。

4.编写服务消费者

4.1 直接调用接口

创建一个maven项目fangjia-fsh-substitution-service,然后添加依赖,依赖和服务提供者的一样。启动类也一样。

唯一不一样的是配置信息:

spring.application.name=fsh-substitution
server.port=8082
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程HTTP服务的方法,能够大大提高客户端的编写效率。我们

通过配置RestTemplate来调用接口,代码如下:

@Configuration
public class BeanConfiguration {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

创建接口,在接口中调用house/hello接口,代码如下:

@RestController
@RequestMapping("/substitution")
public class SubstitutionController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/callHello")
    public String callHello() {
        return restTemplate.getForObject("http://localhost:8081/house/hello", String.class);
    }
}

启动启动类启动消费者服务,访问localhost:8082/substitution/callHello看看有没有返回hello字符串,返回了就证明调用成功。

4.2 通过Eureka来消费接口

上面是直接通过服务接口的地址来调用的,完全没有用到Eureka带给我们的便利。既然用了注册中心,那么客户端调用的时候肯定是不需要关心有多少个服务提供接口,下面我们来改造之前的调用代码。

首先改造RestTemplate的配置,添加一个@LoadBalanced注解,这个注解会自动构造LoadBalancerClient接口的实现类并注册到Spring容器中,代码如下:

@Configuration
public class BeanConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接下来就是改造调用代码,我们不再直接写固定地址,而是写成服务的名称,这个名称就是我们注册到Eureka中的明称,是属性文件中的spring.application.name,代码如下:

@RestController
@RequestMapping("/substitution")
public class SubstitutionController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/callHello")
    public String callHello() {
        return restTemplate.getForObject("http://fsh-house/house/hello", String.class);
    }
}
5.开启Eureka认证

注册中心有公网IP的话,加上权限认证来保证安全性。

改造我们的注册中心,通过集成Spring-Security来进行安全认证。在pom中添加Spring-Security的依赖,然后在配置文件中加上认证的配置信息:

#是否开启基本的鉴权,默认为true,不想要密码就设置为false
security.basic.enabled=false
security.user.name=xuchao
security.user.password=123abc

注意:

不添加security的jar包,就不需要密码;

添加了,不设置用户名密码,用户名默认:user   密码:默认产生的随机密码   (一般默认用户名有admin,root,user,guest)

添加后,就是自己的,注意用户名密码后面可以有空格,不小心打了空格一定要检查,确保输入正确。


在Eureka开启认证后,客户端注册的配置也要加上认证的用户名和密码信息,如:

eureka.client.service-url.defaul-zone=http://用户名:密码@localhost:8761/eureka
02-14 02:30