在搭建之前现任一下Nacos。什么是Nacos?官方的话语就不说了,它就是一个服务发现的和管理配置的组件,跟Eureka相似,只是Eureka自己要写一个服务区成为注册中心,Nacos就是中间键,下载安装即可食用。
官方提供了Nacos的服务端供我们下载使用,我们启动Nacos后将我们的微服务注册进入Nacos即可。
下载地址:https://github.com/alibaba/nacos/releases
启动nacos:解压安装
执行bin目录下的startup命令 :startup.cmd -m standalone。我们默认window下启动。
访问Nacos,端口8848:http://127.0.0.1:8848/nacos/index.html,用户名和密码都是:nacos
成功登陆后
接下来就是搭建项目了:父子层级的创建不多说,下面是具体的层级图。我们首先做的就是把order-service服务和user-service注册到nacos中去。然后实现order-service服务调用user-service服务。在浏览器输入order-service接口的方法,显示出来的是user-service的具体数据。
这里的commo-service是公共类只需要写个实体类让其他两个服务调用就行了,我们只在里面写一个实体类:
/**
* 公共的实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
// 名称
private String name;
// 描述
private String desc;
}
springcloudalibaba-parent-0823的依赖如下:
<!--公共的一些配置-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--SpringCloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--这里是所有子项目都可以用的jar包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
user服务:
以后所有的服务注册的主要记住三个步骤:导包,启动类,application.yml配置
导入依赖:
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--加入WEB依赖是为了方便后面写Controller-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos的依赖,用于服务的注册与和管理配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--公共的服务-->
<dependency>
<groupId>com.jd</groupId>
<artifactId>springcloudalibaba-common-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--sentinel的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
编写启动类:
@SpringBootApplication
@EnablediscoveryClient
public class UserStart {
public static void main(String[] args) {
SpringApplication.run(UserStart.class,args);
}
}
编写配置文件:在resource下新建application.yml,内容如下
server:
port: 1010 #端口号
spring:
cloud:
nacos:
server-addr: localhost:8848 #注册中心地址
application:
name: user-service #服务名称
做好这些之后,在启动类中启动userStart,打开nacos的页面,在服务管理 -> 服务列表你就会看user-service服务已经注册到nacos中啦!那照猫画虎,order-service的服务注册也是按照三部曲,导包、编写启动类、配置application.yml的内容也就可以注册到nacos当中啦!熟能生巧,多练几遍就是了,是不是很简单呢!
接下来就来点更有意思的吧,order和user都注册成功后。我们想做的是:通过在浏览器输入order的接口能显示user这边的数据,这就是两个服务之间的调用。
user-service的controller层:
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/getById/{id}",method = RequestMethod.GET)
public User getById(@PathVariable("id") Long id){
return new User(1L,"刘亦菲","是美女");
}
}
显然我们在浏览器输入http://localhost:1010/user/getById/1就能在浏览器看到我们设置的信息。
想在浏览器调用order的接口看到user的内容,一般都会使用openfegin来调用。
order服务
导包:
<!--导入openfegin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加上@EnableFeignClients注解;
UserFeginServer接口:
// 启动类的@EnableFeignClients会扫描@FeignClient的这个注解,进入user-service服务
@FeignClient(value = "user-service",fallbackFactory = UserFeginServerFallback.class)
public interface UserFeginServer {
@RequestMapping(value = "/user/getById/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id") Long id);
}
UserFeginServerFallback:这里涉及到熔断的概念,可以先不管,想用的话也可以看看。
@Component
public class UserFeginServerFallback implements FallbackFactory<UserFeginServer> {
@Override
public UserFeginServer create(Throwable throwable) {
return new UserFeginServer() {
@Override
public User getById(Long id) {
return new User(-1l,"熔断啦","降级啦");
}
};
}
}
OrderController:
@RestController
public class OrderController {
@Autowired
private UserFeginServer userFeginServer;
@RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
public User getUserById(@PathVariable("id") Long id){
return userFeginServer.getById(id);
}
}
这样在浏览访问order的接口就能看到user中的信息啦! 时间匆忙,写的不好指出,见谅!