注册中心在微服务架构中是必不可少的一部分,主要用来实现服务治理功能。
注册中心带来的好处是你不需要知道有多少提供方,你只需要关注注册中心有多少服务即可。
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>
接着在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>
接下来创建一个application.properties文件(创建springboot项目时直接包含的,接下来不在说创建,直接用),添加配置:
spring.application.name=fsh-house server.port=8081 #注册到注册中心去 eureka.client.service-url.defaul-zone=http://localhost:8761/eureka
3.2 编写提供接口
创建一个Controller,提供一个接口给其他服务查询:
@RestController @RequestMapping("/house") public class HouseController { @GetMapping("/hello") public String hello() { return "hello"; } }
4.编写服务消费者
4.1 直接调用接口
创建一个maven项目fangjia-fsh-substitution-service,然后添加依赖,依赖和服务提供者的一样。启动类也一样。
唯一不一样的是配置信息:
spring.application.name=fsh-substitution
server.port=8082
通过配置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); } }
注册中心有公网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