微服务的注册和发现的步骤:
1、服务提供者将服务注册到注册中心
2、服务消费者通过注册中心来查找服务
3、查找到服务后进行调用,不需要进行URL硬编码的方式来进行
4、服务的消费者与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更,注册中心会通知消费者
这里的心跳指的是Eureka server和client之间每隔30秒会进行一次心跳通信,告诉server,client还活着。这种保护状态实际上是考虑了client和server之间的心跳是因为网络问题,而非服务本身问题,不能简单的删除注册信息注册中心使用的是Eureka。Eureka中包含client和server,server提供注册服务,client提供交互。默认心跳时间为30秒。
创建注册中心的步骤:
1、创建注册中心,这里的注册中心需要单独的创建一个项目,然后将其变为注册中心。因此这里又要创建一个项目
2、导入相关的依赖,并且添加Eureka依赖项,注意:这里使用spring cloud版本为Edgware版本的,但是这个版本是基于spring boot 1.5x构建的,也就是说如果使用这个版本而spring boot使用的是2.0.0版本的,则会出现版本不兼容的错误,因此这里就是用Edgware的SR4版本的,同时修改spring boot的版本改为1.5.3即可。
依赖和版本号:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 导入spring cloud依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 导入eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
3、编写入口类
添加注解@EnableEurekaServer注解,表示为一个Eureka注册服务。注意:这里使用的Edgware.SR4版本的eureka,然后添加注解后依然会出现版本与依赖项不兼容的问题,因此需要修改spring的版本,原来为2.0.0版本的,现在改为1.5.3版本的。
入口类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//启用Eureka注册服务
@EnableEurekaServer
@SpringBootApplication
public class registrationApplication {
public static void main(String []args)
{
SpringApplication.run(registrationApplication.class, args);
}
}
4、编写配置文件
配置注册服务的端口,以及一些其他的配置项。注意:这里是需要添加一个配置项的:这里还是将注册服务的ip地址添加至默认的ip地址中,以免后面出错。 eureka.client.healthcheck.enabled=true。代表的好像是注册健康方式,具体信息可以百度。
server:
port: 8083
eureka:
client:
registerWithEureka: false #是否将自己注册到Eureka服务中,本省就是所有无需注册
fetchRegistry: false #是否从Eureka获取注册信息
serviceUrl:
defaultZone: http://localhost:8083/
healthcheck:
enabled: true
这里的默认注册中心的ip地址还是加上,不然后面可能会出问题。
这样,运行项目就可以运行,看到eureka服务的注册中心的页面。这就表示注册中心服务已经完成。
接下来就需要将微服务注册至微服务中心,这样消费服务就可以通过注册中心来调用已注册的服务了。
注册方法:
1、在商品的项目中导入cloud管理的依赖,并且导入eureka依赖,注意,这里的spring boot版本也需要更改。依赖和上面的一样,spring boot的版本号也要改变。
2、编写配置文件
注意:这里还是需要添加上面的那个健康服务的那个值。
添加client属性的是否注册、是否查询、以及注册自己的ip和获取注册服务的ip地址。
server:
port: 8081
spring:
application:
name: ItemMicroservice #服务名称
eureka:
client:
registerWithEureka: true #是否将自己注入Eureka服务中
fetchRegistry: true #是否从Eureka获取信息
serviceUrl:
defaultZone: http://localhost:8083/eureka/
healthcheck: #健康服务属性
enabled: true
instance: #是否将自己的ip注册到Eureka中
prefer-ip-address: true
3、编写入口类
在入口类添加@EnableDiscoveryClient注解,表明添加一个注册服务的client。运行进入注册服务的页面就可以发现多了一个服务。
这样就表明微服务的注册已经完成。
服务的发现
在需要访问商品项目中的方法时,可以通过在注册中心找到该服务并调用相关的方法来实现调用。因此调用者也需要配置spring cloud和eureka的依赖,配置方法和上面的一样。注意spring boot版本号。
1、配置依赖
和上面的一样
2、编写配置文件
处理方法和上面类似
3、修改业务逻辑
在order项目中主要是服务层的ItemService类中调用了商品项目中的方法,因此只需要修改这个类即可,在该类中,原先是
通过商品类的地址来访问调用该方法,这里换为直接调用服务中的对象来获取其方法。首先获取服务中的实例对象,然后获取其URL,再进行访问。
因此首先添加一个DiscoveryClient接口类型的对象,注意:这个DiscoveryClient是一个接口,然后通过这个对象的getInstances方法根据服务的id,也就是服务名来获取服务对象,这里返回的是一个集合,类型为ServiceInstance,因为可以有多个服务名相同,只要他们的端口不同即可代表不同的服务,因此返回的是一个集合,然后判断返回的服务集合是否为空,再调用获取的实例服务对象集合的第几个对象(这里可以为0,代表第一个),返回的是一个ServiceInstance对象,这样就返回了我们要调用的服务对象,然后调用getHost和getPort获取ip和端口,这样就获取了该服务的路由。最后调用RestTemplate对象的getForObject方法,将路由带入参数中即可。
ItemService方法为:
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
public Item queryItemById(Long id)
{
String serviceId="ItemMicroservice";
//通过id获取实例对象
List<ServiceInstance> instances=this.discoveryClient.getInstances(serviceId);
if(instances.isEmpty())
{
return null;
}
//获取到的服务可能是多个,因为服务名可以相同,只不过端口不一样
//下面拿到的是第一个服务
ServiceInstance serviceInstance=instances.get(0);
String url=serviceInstance.getHost()+":"+serviceInstance.getPort();
return this.restTemplate.getForObject("http://"+url+"/item/"+id,Item.class);
}
这里和之前的不一样的是,需要访问的服务路由不是硬编码来获取的,而是从注册中心里根据服务的id名来获取的,最终还是要获取服务方法的路由,因此,最后还是得调用RestTemplate对象来执行该方法来返回一个Item商品对象
4、编写入口类
添加@EnableDiscoveryClient注解
这样就可以运行成功了。
但是,运行结果格式与原先的格式不一样,是xml文件格式,虽然格式样式不一样。所以需要在order项目中的pom中的eureka-server依赖项中添加:
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
该依赖项可以去除xml格式,因此这样就可以和项目预期的结果一样了。
总结:微服务的注册和发现的整个过程中,大致的步骤为:
(1) 创建注册中心项目,
1、创建项目
2、导入eureka依赖,更改spring boot版本号,
3、编写入口类,添加@EnableEurekaServer注解启用eureka服务
4、更改配置文件,设置服务注册中心端口号、设置健康服务值为true,设置本服务是否注入注册中心,是否获取注册中心中服务的信息、注册中心默认ip地址。
(2)添加服务注册
1、在服务中导入相关依赖,依赖项和上面的一样,更改spring boot版本号。
2、在入口类添加@EnableDiscoveryClient注解表示注册中心发现客户端
3、更改配置文件,设置服务端口号、设置本服务的服务名、设置健康服务值为true,设置本服务注入注册中心,获取注册中心中服务的信息、添加注册中心默认ip地址,这里要在eureka地址后面添加eureka/,从而可以获取eureka的绝对路径,
(3)搜索注册的服务
1、导入相关依赖
2、在入口类添加@EnableDiscoveryClient注解表示注册中心发现客户端
3、更改配置文件,设置服务端口号、设置本服务的服务名、设置健康服务值为true,设置本服务注入注册中心,获取注册中心中服务的信息、添加注册中心默认ip地址,这里要在eureka地址后面添加eureka/,从而可以获取eureka的绝对路径。
然后依次运行这三个服务就可以完成从注册中心里获取相关服务的路由然后调动相关方法。