利用IDEA搭建一个微服务项目——SpringCloud学习日志(一)(可能是最啰嗦,但最面向小白的项目搭建)

写在前面:(不愿意看可以跳过)

到了9102年如果你还没有Spring Cloud的经验,那以后连写CRUD的机会都没有了。
我前一段时间工作用到Spring Cloud,那时候光注重业务代码了,没好好搞清内在原理。导致面试的时候人家问到Spring Cloud的知识,仍然是一问三不知。
近期又在系统的学习Spring Cloud的内容,结合工作的应用,又有了一些感悟,决定记下来。
其实网上现在有很多关于Spring Cloud的优秀文章,例如大神“纯洁的微笑”的博客,关于Spring Cloud的各个组件介绍的非常清楚,但这些内容对于初学微服务的小白来讲,太过于严禁,理论化,导致做不出东西,严重打击信心(好吧,我承认说的是我自己)。
而我写的内容不深,注重操作,希望能带一些初学的小伙伴入门,有一定的操作后,再去看理论,会事半功倍。
本文仅面向没有微服务概念的小白(因为当时我就非常无法理解这个概念),也希望大神多多指教,但不接受无理批评
当然要学Spring Cloud,你首先要有Spring Boot的基础,要有写SSM逻辑的经验。
好了废话够多了,开始学习吧。

问题:什么是微服务?Spring Cloud和微服务什么关系?

虽然我不想讲理论(主要是我也讲不深入),但这个问题还是要搞一下,否则会操作还是一头雾水。这两个问题不难,但很难讲清,就像什么是面向对象一样。你可以做的时候慢慢理解,但首先要理解:

  1. Spring Cloud是一个微服务框架,也就是说还有其他微服务框架,Spring Cloud是专门用来搭建微服务应用的。
  2. Spring Cloud本质就是很多个Spring Boot的集合,里面有一些有特殊功能的Spring Boot项目(就是那些大神说的组件),也有你自己的业务代码的Spring Boot项目。
  3. 以前开发Spring Boot项目(SSM也是一样),是一个项目中有多个功能,现在Spring Cloud相当于一个项目,而一个个功能拆分成一个个的Spring Boot项目。

如果以上三条你不能全部理解,那只需要记住第二条第一句的黑体字。这一句话当时我的组长告诉我,看很多关于Spring Cloud的文章就豁然开朗了。

如何搭建一个Spring Cloud项目?

首先打开IDEA,新建一个空maven项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(够详细不?)
建好了以后,去到Spring官网
https://spring.io/projects/spring-cloud#learn
在这里插入图片描述
箭头指的是版本,版本这个地方比较坑,因为G版(Greenwich)和F版(Finchley)对应的Spring Boot版本不同,最好到官网来看一眼,理论上说,G版对应2.1.x的Spring Boot,F版对应2.0.x的Spring Boot,选一个你喜欢的,我选择的是最新版本,也就是最新的G版,点后面的Reference Doc,这个是文档。
在这里插入图片描述
点击Single HTML,进入单页面文档,直接搜索“Example of a pom.xml”,找到官方教你写的pom文档,别犹豫,把需要的部分,Ctrl+C,然后Ctrl+V 粘到你的pom里。(name和description可以不写)
在这里插入图片描述
这样父项目就搭建好了,甚至可以说,Spring Cloud 项目搭建好了,当然我知道这样说你会想弄死我,所以我决定,继续教你搭建子项目。
在父项目上右键,新建一个module,选择maven,起名叫user吧(和建立父项目差不多)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(以后的子项目也是这么建,就不截图了)
在user的pom文件中(非父项目的pom)添加spring boot 依赖
在这里插入图片描述

	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

然后在resource文件夹下,添加application.yml
在这里插入图片描述

server:
  port: 5000

然后在java下新建个包,按照Spring Boot项目的结构,写好入口类和controller,这个就比较简单了,写过Spring Boot都会吧
在这里插入图片描述

//入口类的主方法
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class);
    }
}
//这本是两个类,我图方便放在一起了
//UserController的测试方法
@RestController
public class UserController {
    
	//这个是通过id查询用户,因为没设置数据库,所以用了判断,只有id为1可以查到用户
    @GetMapping("/getUser")
    public Map getUser(int id){
        Map user = new HashMap();
        if(1==id){
            user.put("name","小明");
            user.put("age",10);
        }else{
            user.put("status","fail");
            user.put("msg","没有查到该用户");
        }

        return user;
    }

}

这时浏览器只要输入http://localhost:5000/getUser?id=1,就会看到我们的json
在这里插入图片描述
当然这与普通的Spring Boot 项目无异,微服务关键是实现服务之间的调用,换句话说,就是不同的Spring Boot之间的调用,前面说了,每一个功能都是一个Spring Boot项目,如果将来我们有一个订单模块,用户和订单不再是同一个项目,那就需要用户模块调用订单模块,所以这个demo的关键是模拟用户模块的Spring Boot调用订单模块的Spring Boot(也就是用户的微服务调用订单的微服务,做到这里我相信你对微服务已经开始有了最初的感触,说白一个微服务就是一个Spring Boot)。
我们再用同样的方法建立一个订单的子项目,叫做order,同样添加pom依赖,配置端口为6000,写好启动类和Controller
如下:
在这里插入图片描述

@RestController
public class OrderController {

    @GetMapping("/getOrder")
    public Map getOrder(int id){
        Map map = new HashMap();
        if(1==id){
            map.put("orderNum","1111");
            map.put("price",1000);
        }else{
            map.put("status","fail");
            map.put("message","找不到用户订单");
        }

        return map;
    }
}

此时,还要修改一下用户模块,实现服务间的通讯(难度来了,请注意)
首先在user下添加一个AppConfig类(注意目录结构)
在这里插入图片描述

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

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

然后Controller类添加通讯方法和所需要的属性
在这里插入图片描述

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {

	//通过这个类进行网络通讯
    @Resource
    RestTemplate restTemplate;

	//当你请求User这个服务的方法时,它又去调用Order这个服务的方法
    @GetMapping("/getUserOrder")
    public Object getUserOrder(int id){
        String url ="http://localhost:6000/getOrder?id="+id;
        return restTemplate.getForObject(url,Object.class);
    }

    @GetMapping("/getUser")
    public Map getUser(int id){
        Map user = new HashMap();
        if(1==id){
            user.put("name","小明");
            user.put("age",10);
        }else{
            user.put("status","fail");
            user.put("msg","没有查到该用户");
        }

        return user;
    }
}

这个时候,当我们输入http://localhost:5000/getUserOrder?id=1,可以看到,我们请求的是User的端口,但User又去请求Order的端口,从而得到结果,这样就实现了服务间的调用。

你可能会有疑问

看到这你心中可能会有很多疑问:我为什么要分离这两个模块?这样做不会有问题吗?我可以明确告诉你,微服务分离有很多好处,最直观的是可以解耦,也可以实现分布式的部署,但现在这样做有很多问题,包括服务间的通讯,如果User 去访问Order,Order已经宕机怎么办?而这些问题都是Spring Cloud整合组件需要完成的任务。

但毫无疑问

我们现在搭建的已经是一个Spring Cloud的微服务项目,摒弃掉复杂的组件和原理,现在已经是一个微服务的原型,只不过他过于简陋,还需要更多的内容填充进来,而这些东西不能一蹴而就,需要更长时间的积累。所以不要着急,先利用这个简单的例子体会什么是Spring Cloud 构建的微服务,直观的说每个Spring Boot就是一个微服务,反之也成立。理解这个,你再去看各位大神的博客文章,我相信一定有更好的理解。

Ps.这可能是这个系列的第一篇,也可能是最后一篇,如果你觉得本文有用,就且看且珍惜吧

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个新的Spring Boot项目 首先,我们需要在IDEA中创建一个新的Spring Boot项目。在IDEA的欢迎页面中选择“Create New Project”,然后选择“Spring Initializr”。 在Spring Initializr页面中,我们需要填写一些项目的基本信息,包括项目名称、描述、包名、Java版本、Spring Boot版本等。在这里,我们选择使用JDK 8,Spring Boot 2.2.2版本。 2. 添加Spring Cloud依赖 在创建完项目后,我们需要添加Spring Cloud的依赖。在pom.xml文件中添加以下依赖: ``` <dependencies> <!-- Spring Cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Others --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies> ``` 这些依赖包括了Spring Cloud Eureka、Spring Cloud Config、Spring Cloud OpenFeign、Spring Cloud Zipkin等。 3. 配置Eureka注册中心 在application.yml文件中添加以下配置: ``` spring: application: name: service-demo cloud: config: uri: http://localhost:8888 profile: dev zipkin: base-url: http://localhost:9411 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ ``` 这里我们使用了Eureka作为服务注册中心,将服务的注册地址配置为http://localhost:8761/eureka/。 4. 创建服务接口 我们创建一个简单的服务接口,用于测试Spring Cloud的服务调用功能。 ``` public interface HelloService { @GetMapping("/hello") String hello(@RequestParam("name") String name); } ``` 5. 创建服务实现 创建服务实现类并使用@FeignClient注解标记为Feign客户端。 ``` @Service @FeignClient("service-provider") public class HelloServiceImpl implements HelloService { @Override public String hello(String name) { return "Hello " + name + "!"; } } ``` 6. 启用服务发现 在应用主类上添加@EnableDiscoveryClient注解以启用服务发现。 ``` @SpringBootApplication @EnableDiscoveryClient public class ServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(ServiceConsumerApplication.class, args); } } ``` 7. 测试服务调用 在测试类中注入HelloService并进行调用测试。 ``` @RunWith(SpringRunner.class) @SpringBootTest public class HelloServiceTest { @Autowired private HelloService helloService; @Test public void testHello() { String result = helloService.hello("world"); System.out.println(result); Assert.assertEquals("Hello world!", result); } } ``` 8. 启动服务并注册到Eureka 将服务启动后,可以在Eureka的管理页面中查看到该服务的注册信息。 至此,一个简单的Spring Cloud微服务项目就已经搭建完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值