SpringCloud之项目搭建与服务注册
在上一篇文章中:搭建SpringMVC与SpringBoot项目了解了Spring的基本使用,本文将继续学习SpringCloud相关知识,主要包括环境搭建和服务注册等内容,进而迈入Java微服务的大门~
学习SpringCloud需要先掌握SpringBoot基本技术,参考
- Idea创建springboot项目和springcloud项目方法
- Spring Cloud 学习教程
- 使用IDEA搭建第一个Spring Cloud项目(图解),这篇文章写得不错,照着图解一步一步就可以把项目跑起来
如果对Java比较陌生,可以先看看NodeJS相关的微服务实现框架
本文相关代码均放在github上面了。
服务注册
参考
手动管理每个服务之间的依赖是十分繁琐的,
- 每个服务需要在业务逻辑中判断其依赖的服务是否启动可用
- 每个服务在下线时,需要通知依赖它的其他服务
在一个微服务系统中,可能存在很多个服务,手动管理就显得十分麻烦,一般会使用统一的服务注册中心来管理所有服务
注册中心主要用于接受和维护各个服务的信息(如地址和端口号等),服务或网关可以通过注册中心查询目标服务地址,动态实现服务访问,且可以实现负载均衡等特性。
常见的注册工具有consul
、zookeeper
和eureka
,具体区别参考:微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比
IDEA初始化SpringCloud项目
下文截图所有操作均在IDEA 2019.3版本下进行~
根项目,不添加任何依赖
点击Next->Finish,等待项目目录初始化,大概是下图的样子
将每个服务当做是一个Module,创建Module的方式为:在项目根目录右键新建一个Module(后面新建其他服务同理)
服务注册
新建一个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
正常情况下是可以看见下面内容的
可以看见现在还没有任何服务实例,接下来去创建对应的服务项
添加两个服务
第一个服务
接着我们添加一个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
,可以看见已经启动了一个服务实例
服务暴露接口
当然我们也可以通过端口号直接访问这个服务,在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
。
第二个服务
如法炮制,我们来创建第二个服务auth,该服务依赖user-service并实现登录相关的接口,
与上面的手法一致,我们创建对应的Module,同样依赖Spring Web
和Eureka 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
的区别在于:我们这里是通过调用内部服务实现的!这是微服务非常重要的一步。
小结
本文主要介绍了使用IDEA搭建一个SpringCloud微服务Demo并成功启动,大致步骤为
- 创建项目
- 创建Module
- 创建eureka作为注册服务器,选择spring boot模板及Eureka
- 创建一个业务服务提供模块,选择spring boot模板及Eureka client
- 创建一个业务消费模块,选择spring boot模板及Eureka client
- 启动三个服务,访问业务消费服务,整个系统正常运行
从实践出发是学习SpringCloud最简单的方式,接下来还需要了解业务开发、服务部署、负载均衡等技术细节了。
你要请我喝一杯奶茶?
版权声明:自由转载-非商用-保持署名和原文链接。
本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。