说明
问题:SpringCloud有那么多组件,我们如何入门呢?
答:分布式程序,最基础的功能就是实现实例与实例直接的远程调用。又因为我们Springcloud实现远程调用需要依赖注册中心来实现负载均衡,所以我们要实现实例与实例直接的远程访问,先配置注册中心。 如图所示:
前提:配置父项目
说明:先创建Maven聚合项目,再创建三个eureka,instance-service,instance-client三个模块。聚合项目的父项目的src可以删除掉。
– 父项目pom.xml
–父项目大致结构图
第一部分:配置Eureka注册中心
第一步:创建SpringBoot项目加入依赖
--父项目选择模块
--选择Spring Initializr
--选择依赖
--对应的pom.xml依赖代码
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
第二步:启动Eureka注解
@SpringBootApplication
@EnableEurekaServer //启动Eureka服务器
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
第三步:配置Eureka服务信息
##服务器信息
server.port=5121
##指定Eureka服务信息
eureka.instance.hostname=localhost
##服务入口
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
#3.是否将自身注册为服务 false表示不注册
eureka.client.register-with-eureka=false
#4.是否主动发现服务 false表示不发现
eureka.client.fetch-registry=false
第四步:启动入口类,注册中心
启动后,浏览器键入http://localhost:5121
第二部分:实现服务方实例
第一步:创建SpringBoot项目
--选择依赖
--POM.xml文件依赖情况如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
第二步:入口类加入启动Eureka客户端
@SpringBootApplication
@EnableEurekaClient //服务方需要声明是一个Eureka注册中心的客户端
public class InstanceServerApplication {
public static void main(String[] args) {
SpringApplication.run(InstanceServerApplication.class, args);
}
}
第三步:配置文件
--修改application.properties配置文件,必须包含实例名和注册中心的访问路径
##服务端口
server.port=8080
##必须要指定服务器,因为到时我们就可以该名称集群和让调用找到服务的
spring.application.name=InstanceServer
##指定注册中心的入口。要跟eureka模块的该键的值一一对应。
eureka.client.service-url.defaultZone=http://localhost:5121/eureka
第四步:编写POJO
@Data
public class User implements Serializable{
private int id;
private String username;
private String password;
}
第五步:编写一个Controller
@RestController
public class UserController {
/**
* 用户注册
* @param user
* @return
*/
@PostMapping(value = "/login")
//注意:是使用JSON数据传递对象
//客户端restTemplate是通过application/json格式发送对象数据的,所以需要加上@RequestBody
public String login(@RequestBody User user){
System.out.println("服务方"+user.getUsername());
return "OK 8080服务方:"+user.getUsername();
}
}
第六步:启动测试
第三部分:实例调用方实例
第一步:创建SpringBoot项目
《通过复制服务方实例》修改就可以。依赖和服务方是一致的。
第二步:修改入口类
@SpringBootApplication
@EnableDiscoveryClient //启动调用方发现服务。等同于@EnableEurekaClient
public class InstanceClientApplication {
public static void main(String[] args) {
SpringApplication.run(InstanceClientApplication.class, args);
}
//创建远程调用对象
@Bean
@LoadBalanced //支持负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
第三步:配置文件
##服务端口
server.port=8081
##必须要指定服务器,因为到时我们就可以该名称集群和让调用找到服务的
spring.application.name=instance-client
##指定注册中心的入口:
eureka.client.service-url.defaultZone=http://localhost:5121/eureka
第四步:创建pojo类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String username;
private String password;
}
第五步:创建一个Service类
@Service
public class UserService {
@Autowired
private RestTemplate restTemplate;
public String login(User user){
//远程调用服务方,注意调用URL使用的是服务方的应用名,而不是IP端口
//注意:postForObject发送的user对象是json字符串的
String result = restTemplate.postForObject("http://InstanceServer/login", user, String.class);
System.out.println("8081 客户端::"+result);
return result;
}
}
第四步:修改Controller
--修改Controller调用Service远程访问
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping(value = "/login")
public String login(User user){
return userService.login(user);
}
}
第五步:使用Postman测试
启动调用方程序,然后使用postman工具测试结果 路径为:http://localhost:8081/login?username=zhangsan&password=123456