版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kukubao207/article/details/80997785
最近在做一个Spring Clound的微服务项目.记录自己的学习过程.
首先谈谈微服务的好处
1.某个服务器节点出现故障,也只是停掉了那一个服务器上的服务,其他的功能的服务仍然可以供用户使用.
2.每一个服务都可以看做是一个独立的项目,适合多人合作开发.
3.每一个服务(项目)功能更新一个版本,上线时只需要打包那一个特定功能的项目即可,其他线上的项目功能仍能提供给用户使用.
一.服务之间的调用
首先要理解,Spring Cloud有一个服务注册中心,任何两个某功能服务之间的调用,都是通过服务注册中心完成的.
简单来说,在Sping Cloud的服务调用中,有三个角色,分别是服务提供者,服务注册中心,服务调用者.
服务提供者和服务调用者都需要在服务注册中心进行登记,服务调用者通过服务注册中心调用服务提供者提供的所有服务.
1.1 服务注册中心
①pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
②启动类
添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
③application.properties
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.register-with-eureka=false //是否将自己注册到Eureka Server,默认为true
eureka.client.fetch-registry=false //是否从Eureka Server获取注册信息,默认为true
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ //设置Eureka Server的交互地址,查询和注册服务都依赖这个地址
1.2 服务提供者
①pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
②application.properties
spring.application.name=producer-agent //本项目在服务注册中心登记的名字
server.port=8001 //本项目所占用的端口
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ //配置服务中心
③启动类
@SpringBootApplication
@EnableDiscoveryClient //这个配置使得Eureka Server服务注册
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
④消费者想要调用的某个接口
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index(String name) {
return "hello "+name+",this is first messge";
}
}
1.3 服务调用者
①pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
②application.properties
spring.application.name=consumer-agent //本项目在服务注册中心登记的名字
server.port=8002 //本项目所占用的端口
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/ //配置服务中心
③启动类
启动类上要添加@EnableDiscoveryClient和@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
④定义接口(将服务提供者提供的接口本地化)
@FeignClient(name= "producer-agent") //这里的名字要与服务提供者在服务注册中心登记的名字相同
public interface HelloRemote {
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "name") String name); //这里的@RequestParam不加会报错
}
⑤调用服务提供者提供的接口
@RestController
public class ConsumerController {
@Autowired
HelloRemote HelloRemote;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return HelloRemote.hello(name);
}
}
1.4 服务调用时返回值的类型
如果你需要调用的接口返回值均为简单类型,那么就不会出现bug.
但如果你的返回值是一个复杂的对象,那就需要在该对象类型定义中重写toString()方法.
在我们的项目里,同一规定所有接口的返回类型均为ResultData,因此是需要重写toString()方法的.
package finley.gmair.util; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; public class ResultData { ... ... ... @Override public String toString() { //重写toString方法 return JSONObject.toJSONString(this, SerializerFeature.DisableCircularReferenceDetect); } }