SpringCloud(三)eureka注册中心的使用

源码

GitHub:https://github.com/291685399/springcloud-learning/tree/master/springcloud-eureka02

eureka是什么?

eureka是Netflix公司开源的注册中心,用于管理生产者和消费者,能够对服务进行服务的自动注册、发现、状态监控

eureka的原理

在这里插入图片描述

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

eureka的使用

  • 新建一个父工程,命名为springcloud-eureka02

目录结构如下图:
在这里插入图片描述
pom.xml:

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

<dependencies>
    <!-- springboot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • 新建模块,命名为eureka-server02

目录结构如下图:
在这里插入图片描述
pom.xml:

<parent>
    <groupId>com.wyj</groupId>
    <artifactId>springcloud-eureka02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在启动器EurekaServerApplication上添加注解用于开启eureka server

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

在application.properties:

server.port=10000
spring.application.name:eureka-server
# 是否注册自己的信息到EurekaServer,默认是true
eureka.client.register-with-eureka=false
# 是否拉取其它服务的信息,默认是true
eureka.client.fetch-registry=false
# EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址
eureka.client.service-url.defaultZone:http://127.0.0.1:${server.port}/eureka
  • 新建模块,命名为eureka-provider02

目录结构如下图:
在这里插入图片描述

pom.xml:

<parent>
    <groupId>com.wyj</groupId>
    <artifactId>springcloud-eureka02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>

<dependencies>
    <!-- springdatajpa -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- springboot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- springcloud eureka client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在启动器EurekaProviderApplication上添加注解用于开启eureka client

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

ProviderController:

@Controller
public class ProviderController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/findById/{id}")
    @ResponseBody
    public User findById(@PathVariable int id) {
        User user = userService.findById(id);
        return user;
    }
}

UserService:

public interface UserService {
    public User findById(int id);
}

UserServiceImpl:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public User findById(int id) {
        Optional<User> userOptional = userRepository.findById(id);
        User user = userOptional.get();
        return user;
    }
}

UserRepository:

public interface UserRepository extends JpaRepository<User, Integer> {
}

User:

@Entity
@Data
public class User implements Serializable {

    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String sex;
    private int age;
    private String address;
    private String phone;
}

application.properties:

server.port=8081
### datasource ###
spring.datasource.url=jdbc:mysql://188.131.247.26:3306/springcloud-eureka01?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
### springdatajpa ###
#打印出自动生产的SQL,方便调试的时候查看
spring.jpa.show-sql=true
#更新数据库表结构
spring.jpa.hibernate.ddl-auto= update
#对打印的sql进行格式化,方便查看
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
#指定生成表名的存储引擎为InneoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# springcloud
spring.application.name=eureka-provider
# EurekaServer地址
eureka.client.service-url.defaultZone=http://127.0.0.1:10000/eureka
# 当调用getHostname获取实例的hostname时,返回ip而不是host名称
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=127.0.0.1
  • 新建模块,命名为eureka-consumer02

目录结构如下图:
在这里插入图片描述

pom.xml:

<parent>
    <groupId>com.wyj</groupId>
    <artifactId>springcloud-eureka02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>

<dependencies>
    <!-- springboot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- springcloud eureka client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在启动器EurekaConsumerApplication上添加注解用于开启eureka client

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

ConsumerController:

@Controller
public class ConsumerController{

    @Autowired
    private RestTemplate restTemplate;

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

    @RequestMapping(value = "/findById/{id}")
    @ResponseBody
    public User findById(@PathVariable int id) {
        // 根据服务名称,获取服务实例
        List<ServiceInstance> instances = discoveryClient.getInstances("eureka-provider");
        // 因为只有一个UserService,因此我们直接get(0)获取
        ServiceInstance instance = instances.get(0);
        String baseUrl = "http://" + instance.getHost() + ":" + instance.getPort();
        System.out.println("baseUrl=" + baseUrl);
        User user = restTemplate.getForObject(baseUrl + "/findById/" + id, User.class);
        return user;
    }
}

RestConfig:

@Configuration
public class RestConfig {

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

User:

@Data
public class User implements Serializable {

    private int id;
    private String name;
    private String sex;
    private int age;
    private String address;
    private String phone;
}

application.properties:

server.port=8080
# springcloud
spring.application.name=eureka-consumer
# EurekaServer地址
eureka.client.service-url.defaultZone=http://127.0.0.1:10000/eureka
# 当调用getHostname获取实例的hostname时,返回ip而不是host名称
eureka.instance.prefer-ip-address=true

测试使用

分别启动eureka-server、eureka-provider02和eureka-consumer02

  • 访问

浏览器访问http://127.0.0.1:8080/findById/1
在这里插入图片描述

总结

有了eureka注册中心相比于纯粹使用RestTemplate没有注册中心而言
1、有了注册中心更加方便管理生产者和消费者,在注册中心页面可以查看到很多信息,比如实例信息,比如注册中心信息
2、有了注册中心可以动态的获取提供者实例的rest服务路径,然后使用RestTemplate调用生产者的rest服务
3、注册中心eureka还可以进行集群,提高数据的吞吐量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值