一起学SpringCloud之:第二章注册中心

上一章我们说过在没有SpringCloud的时候,我们写微服务项目的时候,会有以下问题:

服务管理

  • 如何自动注册和发现
  • 如何实现状态监管
  • 如何实现动态路由
  • 服务如何实现负载均衡
  • 服务如何解决容灾问题
  • 服务如何实现统一配置

以上的问题,我们都将在SpringClond中得到答案

1:Eureka注册中心

1.1认识Eureka

说下我们解决第一个问题,服务的管理

问题分析

在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦,这与DevOps的思想是背道而驰的。

网约车

这就好比是 网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少,不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个愿意给,就是缺少引子,缺乏管理啊。

此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴注册,记录你的车型(服务类型),身份信息(联系方式)。这样提供服务的私家车,在滴滴那里都能找到,一目了然。

此时要叫车的人,只需要打开APP,输入你的目的地,选择车型(服务类型),滴滴自动安排一个符合需求的车到你面前,为你服务,完美!

Eureka做什么?

Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
同时,服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。
这就实现了服务的自动注册、发现、状态监控。

2:原理图

一起学SpringCloud之:第二章注册中心_第1张图片

  • Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
  • 提供者:启动后向Eureka注册自己的信息(访问地址,提供什么服务)
  • 消费者:向Eureka订阅服务,Eureka会将服务的所有提供者地址列表发送为消费者,并且定期根更新
  • 心跳:提供者定期通过Http方式向Eureka 刷新在自己的状态

1:入门案例

接下来我们在原有项目的基础上创建一个子工程
一起学SpringCloud之:第二章注册中心_第2张图片
这个项目的pom依赖:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    
    <parent>
        <groupId>com.fuxigroupId>
        <artifactId>springcloud01artifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    
    <groupId>com.fuxigroupId>
    <artifactId>eurekaartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>eurekaname>
    <description>Demo project for Spring Bootdescription>

    <dependencies>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>
        
    dependencies>
    
project>

我们需要进行一些基本配置

首先是启动类上添加注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

接着是配置文件中:

server.port=10086

spring.application.name=eureka-server # 应用名称,会在Eureka中显示

# EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
eureka.client.service-url.defaultZone:http://localhost:10086/eureka 

eureka.client.register-with-eureka=false #禁止自己当做服务注册
eureka.client.fetch-registry=false      #屏蔽注册信息

启动服务,并访问:
一起学SpringCloud之:第二章注册中心_第3张图片

2:将服务提供者注册到Eureka

注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。

我们在User-Service中添加客户端依赖

pom文件如下:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    
    <parent>
        <groupId>com.fuxigroupId>
        <artifactId>springcloud01artifactId>
        <version>1.0-SNAPSHOTversion>
    parent>
    
    <groupId>com.fuxigroupId>
    <artifactId>userserviceartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>userservicename>
    <description>Demo project for Spring Bootdescription>

    
    <dependencies>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.19version>
        dependency>

		**#eureka客户端的依赖**
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        
        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>2.1.1version>
        dependency>
        
    dependencies>
    
project>

在启动类上开启Eureka客户端功能

通过添加@EnableDiscoveryClient来开启Eureka客户端功能

@SpringBootApplcation
@EnableDiscoveryClient //开启EurekaClient的功能
// @EnableEurekaClient 这个注解和@EnableDiscoveryClient 的作用是一样的但是 @EnableDiscoveryClient 可以更通用,
// 选一个使用即可。
public class UserServiceApplication{
    
    public static void main(String [] args){
        SpringApplication.run(UserServiceApplication.class,args);
    }   
}

编写配置文件:

server.port=8081
#这个表示我们注册到eureka的时候,微服务的名称,很重要。
spring.application.name=userService

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///****
spring.datasource.username=***
spring.datasource.password=*****

mybatis.mapper-locations=classpath:config/mapper/*.xml

#这是我们在上面写的eureka的地址。
eureka.client.service-url.defaultZone:http://localhost:10086/eureka

注意:

  • 这里我们添加了spring.application.name属性来指定应用名称,将来会作为应用的id使用。

重启项目,访问Eureka监控页面查看

一起学SpringCloud之:第二章注册中心_第4张图片
我们会发现user-service服务已经注册成功了

3:消费者从Eureka获取服务

我们修改consumer-demo,尝试从EurekaServer 获取服务。

方法与消费者类似,只需要在项目中添加EurekaCilent依赖,就可以通过服务名称来获取信息了!

1:添加依赖

pom文件:

   <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
   dependency>

2:修改配置:

server.port=8082
spring.application.name=itemsService

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///******
spring.datasource.username=****
spring.datasource.password=****

eureka.client.service-url.defaultZone:http://localhost:10086/eureka
    

3:添加启动类注解:

@SpringBootApplication
@EnableDiscoveryClient
public class ItemsserviceApplication {

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

}

4:修改代码,用DiscoveryClient类的方法,根据服务名称,获取服务实例:

@Service
public class UserService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;// Eureka客户端,可以获取到服务实例信息

    public User queryUserByIds(int id) {
        // String baseUrl = "http://localhost:8081/user/";
        // 根据服务名称,获取服务实例
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        // 因为只有一个UserService,因此我们直接get(0)获取
        ServiceInstance instance = instances.get(0);
        // 获取ip和端口信息
        String baseUrl = "http://"+instance.getHost() + ":" + instance.getPort()+"/user/selectOne/";
         return this.restTemplate.getForObject(baseUrl + id, User.class);
    }
}

这样,基本的eureka的使用就完成了。

3 Eureka 详解

接下来我们相似讲解Eureka的原理及配置

1:基础架构

Eureka架构中的三个核心角色:

  • 服务注册中心

    Eureka的服务端应用,提供服务注册和发现功能,就是我们建立的Eureka-demo;

    • 服务提供者

    提供服务的应用,可以是SpringBoot应用,也可以是其他人以技术实现,只要对外提供的是Rest风格服务即可。本利中就是我们实现的user-service-demo

    • 服务消费者

​ 消费应用从注册中心获取服务列表,从而得到每个服务方的消息,知道去哪里调用服务方。本例中就是我们实现的concumer-demo

本篇结束,下一篇我们将简绍负载均衡ribbon的使用,获取更多内容请查看我的个人主页。请大家支持一下兄弟, 点个赞,不要白嫖了。。。

你可能感兴趣的:(Spring,SpringCloud,java,java)