SpringCloud之项目搭建与服务注册

在上一篇文章中:搭建SpringMVC与SpringBoot项目了解了Spring的基本使用,本文将继续学习SpringCloud相关知识,主要包括环境搭建和服务注册等内容,进而迈入Java微服务的大门~

<!--more-->

学习SpringCloud需要先掌握SpringBoot基本技术,参考

如果对Java比较陌生,可以先看看NodeJS相关的微服务实现框架

本文相关代码均放在github上面了。

1. 服务注册

参考

手动管理每个服务之间的依赖是十分繁琐的,

  • 每个服务需要在业务逻辑中判断其依赖的服务是否启动可用
  • 每个服务在下线时,需要通知依赖它的其他服务

在一个微服务系统中,可能存在很多个服务,手动管理就显得十分麻烦,一般会使用统一的服务注册中心来管理所有服务

注册中心主要用于接受和维护各个服务的信息(如地址和端口号等),服务或网关可以通过注册中心查询目标服务地址,动态实现服务访问,且可以实现负载均衡等特性。

常见的注册工具有consulzookeepereureka,具体区别参考:微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比

2. IDEA初始化SpringCloud项目

下文截图所有操作均在IDEA 2019.3版本下进行~

根项目,不添加任何依赖

点击Next->Finish,等待项目目录初始化,大概是下图的样子

将每个服务当做是一个Module,创建Module的方式为:在项目根目录右键新建一个Module(后面新建其他服务同理)

3. 服务注册

新建一个Module,选择Spring Initializr

Dependencies添加一个SpringCloudDiscovery,这里选择Eureka Server作为服务注册服务器

等待模块目录初始化完成,在模块的启动文件Application类下添加@EnableEurekaServer注解,表示为服务注册服务器

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer // 添加这一行
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

同时添加配置

server.port=8888
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

这里表示eureka的服务端口号为8888,后面增加的其他服务均可以通过该地址和端口号找到eureka服务并进行注册

然后其中这个EurekaServerApplication服务,启动完毕后浏览器访问http://127.0.0.1:8888

正常情况下是可以看见下面内容的

可以看见现在还没有任何服务实例,接下来去创建对应的服务项

4. 添加两个服务

4.1. 第一个服务

接着我们添加一个Module作为新的服务,我们将这个服务命名为user-module,主要用于提供用户信息等服务。

跟上面一样,同样选择模板为Spring Initializr,注意这个模块的Dependiencies

  • 需要添加Eureka Discovery Client,这样才能把当前模块作为服务注册到上面的Eureka服务器中
  • 添加Spring Web,这样才可以提供接口等服务

然后等待模块初始化完毕,在对应启动类添加@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient // 添加这一行
public class UserModuleApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserModuleApplication.class, args);
    }
}

同时在application.properties增加服务配置

server.port=8889
spring.application.name=user-service
eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://localhost:8888/eureka

这里表示当前服务的启动端口为8889,同时配置eureka的服务地址为http://localhost:8888/eureka

配置完成之后我们就可以启动UserModuleApplication了,然后刷新http://127.0.0.1:8888,可以看见已经启动了一个服务实例

4.2. 服务暴露接口

当然我们也可以通过端口号直接访问这个服务,在UserModuleApplication新建一个UserInfoController

package com.example.user;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserInfoController {

    @RequestMapping(value = "/user/{name}",method = RequestMethod.GET)
    public String findName(@PathVariable("name") String name){
        return "Hello, " + name;
    }
}

重启服务,然后直接访问http://127.0.0.1:8889/user/shymean,可以看见浏览器直接输出了Hello, shymean

4.3. 第二个服务

如法炮制,我们来创建第二个服务auth,该服务依赖user-service并实现登录相关的接口,

与上面的手法一致,我们创建对应的Module,同样依赖Spring WebEureka Discovery Client

模块目录初始化完毕后记得添加EnableEurekaClient和配置properties启动端口,这里设置为

server.port=8890
spring.application.name=auth-service
eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://localhost:8888/eureka

然后启动AuthApplication,刷新http://127.0.0.1:8888可以看见第二个服务也注册成功了

然后我们新建一个AuthController,编写登录相关逻辑

package com.example.auth;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.ws.rs.QueryParam;

@RestController
@Configuration
public class AuthController {

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

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String findName(@QueryParam("name") String name, @QueryParam("password") String password) {
        RestTemplate restTemplate = getRestTemplate();
        // todo 检测name和password
        // 一种通过host + serviceName + url调用内部服务的方式
        String msg = restTemplate.getForObject("http://user-service/user/" + name, String.class);
        return msg;
    }
}

然后启动服务,访问http://127.0.0.1:8890/login?name=shymean&password=123,就可以看见熟悉的Hello, Shymean了,与上面直接访问http://127.0.0.1:8889/user/shymean的区别在于:我们这里是通过调用内部服务实现的!这是微服务非常重要的一步。

5. 小结

本文主要介绍了使用IDEA搭建一个SpringCloud微服务Demo并成功启动,大致步骤为

  • 创建项目
  • 创建Module
    • 创建eureka作为注册服务器,选择spring boot模板及Eureka
    • 创建一个业务服务提供模块,选择spring boot模板及Eureka client
    • 创建一个业务消费模块,选择spring boot模板及Eureka client
  • 启动三个服务,访问业务消费服务,整个系统正常运行

从实践出发是学习SpringCloud最简单的方式,接下来还需要了解业务开发、服务部署、负载均衡等技术细节了。