学习过程记录,可供刚接触微服务框架童鞋有一个对微服务大概的认知以及搭建一个简单的微服务Demo。文章知识点涉及很浅,也非专业术语就是自己理解,如果哪里不妥当也请大家多多指出。
怎么说呢,上周自己拿到考核任务,搭建SpringCloud+SpringBoot+Nacos+Getaway+Mybatis的项目并完成等等等简单的业务。我看到这个考核题目是有点懵的,因为我之前从没接触过微服务,感觉非常难。事实上我查阅网上资料自己搭建的时候也非常麻烦以及遇到很多坑,但是当最后我搭建完成并顺利跑通那一刻我觉得其实也没那么困难。
1.首先很有必要先了解一下什么是微服务,其实就是将一个大项目拆分为多个小的项目。例如电商系统,没有使用微服务框架的电商项目可能就是一个整体,无论是浏览商品,购买商品,支付金额都是在一个大的SpringBoot项目中所完成,但是采用微服务的话就是将浏览商品服务拆分为一个 SpringBoot项目,而购买商品拆分为一个SpringBoot项目,支付金额拆分为一个SpringBoot项目。
初学者就可以认为是将一个SpringBoot项目拆分成多个Springboot的小项目这种就被称为是微服务。
2.安装 Nacos,我在配置好环境启动项目时候发现不能连接Nacos,我就在想是不是Nacos需要安装?百度一下,果然他是需要安装的·······。(不过好在Nacos是阿里巴巴的,所以安装教程以及基础学习直接去官网查看文档,中文版本的不用担心你看不懂英文,讲的也是最权威的)
Nacos文档
Nacos是一个快速实现动态服务发现、服务配置、服务元数据及流量管理。
把Nacos当成一个点名册,拆分的多个服务都会被注册到点名册上,方便我们发现管理它们。
3.Getawaty是个啥?它其实就充当一个网关,可以将用户请求过滤以及修改然后再通过Getaway去转发到对应的请求服务上。(它本身也是一个服务)
可以理解成一个过滤器,过滤出符合规范的请求进行转发给对应的服务器。
SpringCloud微服务,虽然很多服务,但是服务之间使用的开发环境是相同的,所以Maven依赖也是有很多共同的。那么可以建一个父 Maven项目,然后配置依赖。在大项目中创建各个微服务项目。
1.创建一个Maven项目
2.删除src,配置父pom文件
pom.xml内容
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.5.RELEASEversion>
parent>
<properties>
<java.version>1.8java.version>
<spring.cloud.alibaba.version>2.2.1.RELEASEspring.cloud.alibaba.version>
<spring.cloud.version>Hoxton.SR6spring.cloud.version>
<springframework.version>4.2.1.RELEASEspringframework.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.cloud.alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>2.2.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
<version>2.2.3.RELEASEversion>
dependency>
dependencies>
dependencyManagement>
两个服务创建以及配置过程一样,所以省去product
1.创建一个Maven项目user
2.点击finish进入下一步
3.创建 application.properties并配置
server.port=6666
spring.application.name=user
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*
4.配置pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
<version>2.4.5version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-openfeign-coreartifactId>
<version>2.2.3.RELEASEversion>
dependency>
dependencies>
5.利用install下载父类以及user的依赖,并创建启动类
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
6.user服务我们就构建完成了,我们点击启动就好了
确保Nacos安装成功并且启动
如果存在报错,可能某个细节出现问题直接百度就好了。
同上我们创建product,这里就不在写了。注意端口号改一下
这个时候我们就有两个服务了,我们分别把它们启动,确保Nacos安装成功并且启动。
我们两个服务已经启动这时候我们访问http://localhost:8848/nacos/,用户名和密码都是nacos登录。
ok,其实到这里我们微服务框架就已经搭建起来了,只不过什么都没做而已。现在项目只能算是SpringCloud+SpringBoot+Nacos。
先完善一下项目,体现出来服务之间的调用,在集成Getaway以及Mybatis吧。
我们user服务就可以当做我们客户端,利用user服务去调用product服务的一些功能。
1.UserController.java
@RestController
public class UserController {
@Value("${server.port}")
private String port;
@Autowired
UserClient userClient;
@RequestMapping("/user/index")
@ResponseBody
Map<String,Object> openFeignClient(){
Map<String, Object> stringObjectMap = userClient.openFeign();
return stringObjectMap;
}
}
2.UserClient.java
@FeignClient("product")
public interface UserClient {
@GetMapping("/product/inform")
Map<String,Object> openFeign();
}
3.ProductController.java
@RestController
public class ProductController {
@Value("${server.port}")
private String port;
@GetMapping("/product/inform")
Map<String,Object> openFeign(){
Map<String,Object> map = new HashMap<>();
map.put("访问状态:",200);
map.put("端口号:",port);
map.put("内容:","这里是product服务中心");
return map;
}
}
这里测试请求时候,我遇到一个很搞笑的问题。查了半天才发现并不是我们项目问题,而是浏览器的问题。
当我们用浏览器访问 localhost:6666/user/index和localhost:6667/product/inform时候浏览器会报错
不是404,不是500,当时我看到这里我就蒙了。难道是微服务框架搭建的不对。整了好半天,最后百度才知道···
浏览器默认觉得一些端口号是不安全的,所以不允许发起请求,直接返回服务无法访问页面。也就是我们换个端口号就行,你说不换端口号行不?也行我就是利用postman进行测试的。
1.访问 localhost:6666/user/index
2.localhost:6667/product/inform
我们发现我们调用user服务可以访问到product服务,也可以直接调用product服务。服务之间调用没有问题。基础微服务框架就搭建完毕了…
其实Getaway本身它也是个服务,就接收无论是手机,电脑,网页等等发送的请求,然后转发给其他对应的服务。
配置pom.xml,并Maven install
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
dependencies>
配置application.yml
server:
port: 7666
spring:
application:
name: gateway
cloud:
nacos:
config:
server-addr: localhost:8848
discovery:
service-name: ${spring.application.name}
gateway:
routes:
- id: user-route #指定唯一标识
# uri: http://localhost:6666/ #指定路由服务的地址
uri: lb://user #服务名,实现负载均衡
predicates:
- Path=/user/** #指定路由规则
- id: product-route #指定唯一标识
# uri: http://localhost:6667/ #指定路由服务的地址
uri: lb://product # lb:服务名,实现负载均衡
predicates:
- Path=/product/** #指定路由规则
discovery:
locator:
enabled: true #开启动态服务名动态获取路由地址
management:
endpoints:
web:
exposure:
include: "*" #暴露路由的规则端点 /actuator/gateway/routes
这里localhost:7666/product/product/inform有两个product,第一个product表明是进入product服务,后面/product/inform请求的映射方法。localhost:7666/user/user/index也是同理,如果localhost:7666/product/user/index的话请求会报错404,因为product服务中并没有接收/user/index请求的方法。
这个作为课后作业吧,大家自己练习练习吧!!其实就是SpringBoot集成Mybatis差不多。
自己刚接触自己尝试搭建环境耗费了两天,但如果能看到这篇博客我觉得应该也就一早上就能搞定吧嘻嘻。