[[Architecture-Architecture]]
Architecture
~~~~~~~~~~~~

Camel uses a Java based link:dsl.html[Routing Domain Specific Language
(DSL)] or an link:xml-configuration.html[Xml Configuration] to configure
link:routes.html[routing and mediation rules] which are added to a
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html[CamelContext]
to implement the various
link:enterprise-integration-patterns.html[Enterprise Integration
Patterns].

At a high level Camel consists of a
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html[CamelContext]
which contains a collection of link:component.html[Component] instances.
A link:component.html[Component] is essentially a factory of
link:endpoint.html[Endpoint] instances. You can explicitly configure
link:component.html[Component] instances in Java code or an IoC
container like Spring or Guice, or they can be auto-discovered using
link:uris.html[URIs].

An link:endpoint.html[Endpoint] acts rather like a URI or URL in a web
application or a Destination in a JMS system; you can communicate with
an endpoint; either sending messages to it or consuming messages from
it. You can then create a
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Producer.html[Producer]
or
http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Consumer.html[Consumer]
on an link:endpoint.html[Endpoint] to exchange messages with it.

The link:dsl.html[DSL] makes heavy use of pluggable
link:languages.html[Languages] to create an
link:expression.html[Expression] or link:predicate.html[Predicate] to
make a truly powerful DSL which is extensible to the most suitable
language depending on your needs. Many of the link:languages.html[Languages] 
are also supported as
link:annotation-based-expression-language.html[Annotation Based
Expression Language].

[[Architecture-Diagram]]
Diagram
~~~~~~~

image:architecture.data/camel-components.png[image]
