Spring Cloud的微服务项目的学习过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
    }
}

猜你喜欢

转载自blog.csdn.net/kukubao207/article/details/80997785