本次教程旨在为读者提供2020版本的最佳实践方案,使用我认为最容易学习的组件,可能不少组件有不少替代方案,在这里不依依讲述。本次教程使用的组件以下:html
本次教程整体架构以下:java
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。下载地址github.com/alibaba/nac…linux
下载完成后,解压,在解压后的文件的/bin目录下,windows系统点击startup.cmd就能够启动nacos。linux或mac执行如下命令启动nacos。git
sh startup.sh -m standalone
复制代码
登录页面:http://localhost:8848/nacos/,登录用户nacos,登录密码为nacos。github
本小节工单案例包括2个,一个服务提供者provider 、服务消费者consumer。web
在父pom文件引入相关的依赖,以下:spring
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.4.4</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
复制代码
在provider的pom文件引入依赖:windows
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
复制代码
配置文件application.yml:浏览器
server:
port: 8762
spring:
application:
name: provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
复制代码
写一个接口:markdown
@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String hi(@RequestParam(value = "name", defaultValue = "forezp",required = false) String name) {
return "hello " + name + ", i'm provider ,my port:" + port;
}
}
复制代码
在pom文件引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-loadbalancer</artifactId>
</dependency>
复制代码
须要注意的是引入openfeign,必需要引入loadbalancer,不然没法启动。
配置文件:
server:
port: 8763
spring:
application:
name: consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
复制代码
在工程的启动文件开启FeignClient的功能:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
复制代码
写一个FeignClient,去调用provider服务的接口:
@FeignClient(value = "provider" )
public interface ProviderClient {
@GetMapping("/hi")
String hi(@RequestParam(value = "name", defaultValue = "forezp", required = false) String name);
}
复制代码
写一个接口,让consumer去调用provider服务的接口:
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.hi("feign");
}
}
复制代码
启动两个工程,在nacos页面查看,可见2个服务都已经注册成功:
在浏览器上输入http://localhost:8763/hi-feign,浏览器返回响应:
hello feign, i'm provider ,my port:8762
复制代码
可见浏览器的请求成功调用了consumer服务的接口,consumer服务也成功地经过feign成功的调用了provider服务的接口。
其实feign使用了spring cloud loadbanlancer做为负载均衡器。 能够经过修改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口分别为8761 和8762。在浏览器上屡次调用http://localhost:8763/hi-feign,浏览器会交替显示:
hello feign, i'm provider ,my port:8762
hello feign, i'm provider ,my port:8761
复制代码
在此教程中不讲述,请参考:www.fangzhipeng.com/springcloud…